当我想通过数据帧时,R 如何避免 "for"

标签 r database

举个简单的例子。 我有数据框 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/

相关文章:

r - 模拟ggplot2默认调色板

r - ggplot中跨组的连续线

sql - 外键和引用键有什么区别?

c++ - 提交对 SQLite 数据库的更改,这可以在 QTab 之间看到

r - 从类 "simple_triplet_matrix"转换为类 "matrix"

R:扩展一个序列,使得序列中任何成员的值成为它的位置,未填充的位置编码为 0 或 NA

从列表中删除空条目

c# - 如何从 PostgreSQL 导出数据库?

android - 如何将图像保存到数据库中

mysql - 仅显示 MySQL 数据库模式上已填充表的列表