我想重塑以下数据框数据:
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)
其中ID是与个人绑定的ID号,DEGREE是获得的DEGREE的类型,而YEAR是获得学位的年份。在这种情况下,ID 101获得了BA,MS和PHD。
我想将数据重整形为宽格式,以便每个度数都有列,但不以度值本身命名。另外,我希望每个学位对应的年份。
例如:
主要要点是我不想基于DEGREE或YEAR的值创建新列(这是我尝试使用散布,dcast等时发生的情况)。
谢谢!
答案 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_1
,Degree_2
和Degree_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的反馈。可以使用DEGREE
将YEAR
和data.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