举个简单的例子。
我有数据框 data1
。
name<-c("John","John","Mike","Amy".....)
nationality<-c("Canada","America","Spain","Japan".....)
data1<-data.frame(name,nationality....)
这意味着人们来自不同的国家 每个人都以他的名字和国家为特色,不再重复。
第二个数据框是
name2<-c("John","John","Mike","John",......)
nationality2<-c("Canada","Canada","Canada".....)
score<-c(87,67,98,78,56......)
data2<-data.frame(name2,nationality2,score)
promise 每个人在 data2
中有 5 行,这意味着他们有 5 个分数,但它们是随机排列的。
我想做的是知道每个人的5个分数,但我不关心他叫什么名字,来自哪里。
我想要的最终数据框是
score1 score2 score3 score4 score5
1 89 89 87 78 90
2 ...
3 ...
每一行代表一个人5分,但我不在乎他是谁。
我的数据量很大,所以我不能使用 for
功能。
我能做什么?
最佳答案
虽然已经有一个使用 base R 的已被接受的答案,但我想建议一个解决方案,它使用方便的 dcast()
函数从宽格式 reshape 为长格式,而不是使用 tapply( )
并重复调用 rbind()
:
library(data.table) # CRAN version 1.10.4 used
dcast(setDT(data2)[setDT(data1), on = c(name2 = "name", nationality2 = "nationality")],
name2 + nationality2 ~ paste0("score", rowid(rleid(name2, nationality2))),
value.var = "score")
返回
name2 nationality2 score1 score2 score3 score4 score5
1: Amy Canada 93 91 73 8 79
2: John America 3 77 69 89 31
3: Mike Canada 76 92 46 47 75
关于当我想通过数据帧时,R 如何避免 "for",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44460666/