我试图遍历两个数据帧并基于匹配的名称,从第二个数据帧中绘制一个值到第一个数据帧。现在我的代码看起来像
for (n in 1:180){
for (m in 1:180){
if (league2008[n,1]==league2009[m,1]){
league2008[n,23]=league2009[m,23]
league2008[n,30]=league2009[m,30]
}
}
}
所以现在,如果第1列中的名称匹配,我将从2009年到2008年为该名称带来第23和30列值。这样做,但有没有办法更快地完成这个循环,有没有办法我可以命名列而不只是给它们的索引?我想让我的代码更强大,并在将来更改列。
谢谢!
答案 0 :(得分:2)
我认为这应该可行:
n <- 1:180
m <- 1:180
ind <- expand.grid(n,m)
con <- league2008[ind[,1],1] == league2009[ind[,2],1]
league2008[ind[con,1],23] <- league2009[ind[con,2],23]
league2008[ind[con,1],30] <- league2009[ind[con,2],30]
- 说明 -
这是有效的,因为我们可以向矢量/矩阵/数据帧提供索引向量。举例说明:
a <- 1:10
a[1:5]
# [1] 1 2 3 4 5
我们通过使用n
创建m
和expand.grid(n,m)
之间的所有可能组合来利用这一事实。然后我们执行league2008[ind[,1],1] == league2009[ind[,2],1]
,它返回每个可能的组合是否满足条件。然后,我们只为那些通过ind
返回TRUE
的人ind[con,]
进行分组。