从长到宽的数据重塑

时间:2018-06-19 20:46:07

标签: r

我想重塑以下数据框数据:

  

dat <-data.frame(        ID = c(100,101,101,101,102,103),        DEGREE = c(“ BA”,“ BA”,“ MS”,“ PHD”,“ BA”,“ BA”),        YEAR = c(1980,1990,1992,1996,2000,2004)

dat

其中ID是与个人绑定的ID号,DEGREE是获得的DEGREE的类型,而YEAR是获得学位的年份。在这种情况下,ID 101获得了BA,MS和PHD。

我想将数据重整形为宽格式,以便每个度数都有列,但不以度值本身命名。另外,我希望每个学位对应的年份。

例如:

finaldat

主要要点是我不想基于DEGREE或YEAR的值创建新列(这是我尝试使用散布,dcast等时发生的情况)。

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以尝试将tidyr::spread设置为:

library(tidyr)

spread(dat, DEGREE,YEAR)
#   ID   BA   MS  PHD
#1 100 1980   NA   NA
#2 101 1990 1992 1996
#3 102 2000   NA   NA
#4 103 2004   NA   NA

或:将列分别为Degree_1Degree_2Degree_3的解决方案可以

library(tidyverse)

dat %>% group_by(ID) %>%
  mutate(DegreeNum = paste("Degree", row_number(), sep = "_")) %>%
  unite(DEGREE, c("YEAR", "DEGREE"), sep = ":") %>%
  spread(DegreeNum, DEGREE, fill = "") %>%
  as.data.frame()

#    ID Degree_1 Degree_2 Degree_3
# 1 100  1980:BA                  
# 2 101  1990:BA  1992:MS 1996:PHD
# 3 102  2000:BA                  
# 4 103  2004:BA 

已编辑:基于OP的反馈。可以使用DEGREEYEARdata.table::dcast一起传播为:

library(data.table)

setDT(dat)
dat[,DegreeNum := 1:.N, by=ID]
dcast(dat, ID ~ DegreeNum, value.var = c("DEGREE", "YEAR"))

#     ID DEGREE_1 DEGREE_2 DEGREE_3 YEAR_1 YEAR_2 YEAR_3
# 1: 100       BA       NA       NA   1980     NA     NA
# 2: 101       BA       MS      PHD   1990   1992   1996
# 3: 102       BA       NA       NA   2000     NA     NA
# 4: 103       BA       NA       NA   2004     NA     NA