使用spread或cast在R中创建因子级指标变量

时间:2015-02-16 06:11:57

标签: r reshape dplyr factors tidyr

假设数据结构如下

MemberID <- c(123,123,234,234)
nbin <- 4
imatrix <- matrix(sample(c(0,1), size=nbin * length(MemberID), replace=TRUE), 
                  nrow=length(MemberID))
colnames(imatrix) <- letters[1:nbin]
years <- c("Y1","Y2","Y1","Y2")

mydf <- data.frame(cbind(MemberID, years, imatrix))

我如何制作类似的数据结构,以便我为每个a,b,c,d的每个年级指定一个指标。

我想要一个2 x 9数据框,其中包含MemberID,a.Y1,a.Y2,b.Y1,b.Y2,...

理想情况下,我希望使用spreadcast执行此操作,因为我一直在使用这些工具,并希望了解有关如何使用它们的更多信息。

2 个答案:

答案 0 :(得分:5)

使用tidyr/dplyr

library(dplyr)
library(tidyr)
gather(mydf, Var, Val, a:d) %>% 
             unite(yearsVar, years, Var) %>%
             spread(yearsVar, Val)

答案 1 :(得分:3)

Base R解决方案:

reshape(mydf, timevar = "years", idvar= "MemberID", direction = "wide")
  MemberID a.Y1 b.Y1 c.Y1 d.Y1 a.Y2 b.Y2 c.Y2 d.Y2
1      123    0    0    1    0    0    1    0    0
3      234    1    0    0    0    0    0    1    0

使用reshape2(和magrittr)的解决方案:

mydf %>% melt(c('MemberID','years')) %>% dcast(MemberID~...)
  MemberID Y1_a Y1_b Y1_c Y1_d Y2_a Y2_b Y2_c Y2_d
1      123    0    0    1    0    0    1    0    0
2      234    1    0    0    0    0    0    1    0