Reshape2:变量

时间:2016-03-24 23:23:57

标签: r casting reshape2

我有以下示例数据:

d <- data.frame(id=c(1,1,1,2,2), time=c(1,1,1,1,1), var=runif(5))
  id time         var
1  1    1 0.373448545
2  1    1 0.007007124
3  1    1 0.840572603
4  2    1 0.684893481
5  2    1 0.822581501

我想使用data.frame将此wide改为dcast格式,以便输出如下:

  id     var.1       var.2     var.3
1  1 0.3734485 0.007007124 0.8405726
2  2 0.6848935 0.822581501        NA

有没有人有想法?

3 个答案:

答案 0 :(得分:3)

seq创建序列列id,然后使用dcast

library(reshape2)

set.seed(123)
d <- data.frame(id=c(1,1,1,2,2), time=c(1,1,1,1,1), var=runif(5))

d2 <- transform(d, seq = ave(id, id, FUN = seq_along))
dcast(d2, id ~ seq, value.var = "var")

,并提供:

  id       1       2       3
1  1 0.28758 0.78831 0.40898
2  2 0.88302 0.94047     NaN

答案 1 :(得分:2)

dplyr/tidyr选项spread将是

library(dplyr)
library(tidyr)
d %>%
  group_by(id) %>%
  mutate(n1= paste0("var.",row_number())) %>% 
  spread(n1, var) %>%
  select(-time)
#      id     var.1       var.2     var.3
#    (int)     (dbl)       (dbl)     (dbl)
#1     1 0.3734485 0.007007124 0.8405726
#2     2 0.6848935 0.822581501        NA

答案 2 :(得分:1)

好的 - 这是一个有效的解决方案。关键是要添加一个计数变量。我的解决方案有点复杂 - 也许你可以想出更好的东西。

library(dplyr)
library(magrittr)
library(reshape2)

d <- data.frame(id=c(1,1,1,2,2,3,3,3,3), time=c(1,1,1,1,1,1,1,1,1), var=runif(9))

group_by(d, id) %>%
  summarise(n = n()) %>%
  data.frame() -> count

f <- c()
for (i in 1:nrow(count)) {
  f <- c(f, 1:count$n[i])
}

d <- data.frame(d, f)

dcast(d, id ~ f, value.var = "var")