Объединить в dataframe R, позволяя NA, не используя цикл - PullRequest
1 голос
/ 07 мая 2019

Это пример того, чего я хочу достичь.Я использую цикл for в R. Однако я хочу отойти от этого, так как он слишком медленный для больших данных.Что является лучшим подходом, который все еще работает быстро, когда выходные данные представляют собой намного больший размер данных (например,> 1000 столбцов и строк)?

df <- data.frame(id=c('a', 'a', 'b', 'c', 'c', 'c'), code=c(1,2,3,3,1,2), stringsAsFactors = F)
uid <- unique(df$id)
out <- NULL
df

  id code
1  a    1
2  a    2
3  b    3
4  c    3
5  c    1
6  c    2

for (i in uid){
  z <- t(df[df$id==i,])
  colnames(z) <- z[2,]
  z <- as.data.frame(z[2, , drop = FALSE])
  out <- bind_rows(out, z)
}
out  

     1    2    3
1    1    2 <NA>
2 <NA> <NA>    3
3    1    2    3

Ответы [ 2 ]

3 голосов
/ 07 мая 2019

Это достаточно быстро?

library(reshape2)

dcast(df,id~code)
2 голосов
/ 07 мая 2019

Мы можем использовать complete и spread

library(dplyr)
library(tidyr)

df %>%
  mutate(code1 = code) %>%
  complete(id, code) %>%
  spread(code, code1)

# A tibble: 3 x 4
#  id      `1`   `2`   `3`
#  <chr> <dbl> <dbl> <dbl>
#1 a         1     2    NA
#2 b        NA    NA     3
#3 c         1     2     3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...