所以这就是我的问题所在。我有一个非常大的data.frame
两列,第一列代表x坐标(行),另一列代表y坐标(列),例如:
x y
1 1
2 3
3 1
4 2
3 4
在另一个框架中,我有一些数据(实际上是数字):
a b c d
8 7 8 1
1 2 3 4
5 4 7 8
7 8 9 7
1 5 2 3
我想在第一个data.frame
中添加第三列,其中第二个data.frame
的数据来自第一个data.frame
的坐标。所以结果应该是这样的:
x y z
1 1 8
2 3 3
3 1 5
4 2 8
3 4 8
由于我的data.frames
非常大,for循环太慢了。我认为应用循环系列有一种方法可以做到这一点,但我无法找到。提前致谢(对于丑陋的消息布局感到抱歉,这是我在这里的第一篇文章,我不知道如何使用代码生成这个漂亮的布局,并且在另一个问题中正确data.frames
。)
答案 0 :(得分:3)
这是一个简单的索引问题。无需外部包或*apply
循环,只需执行
df1$z <- df2[as.matrix(df1)]
df1
# x y z
# 1 1 1 8
# 2 2 3 3
# 3 3 1 5
# 4 4 2 8
# 5 3 4 8
答案 1 :(得分:2)
基础R解决方案:( df1
和df2
是坐标和数字作为数据框):
df1$z <- mapply(function(x,y) df2[x,y], df1$x, df1$y )
如果第一个数据框中的最后一个y
已从5
更正为4
,则此方法有效。
我想这是一个错字,因为你在第二个数据框架中没有5列。
答案 2 :(得分:1)
以下是我将如何做到这一点。
首先,使用data.table
进行快速合并;然后转换您的数据框(我将其称为dt1
,坐标为vals
,值为data.table
s。
dt1<-data.table(dt)
vals<-data.table(vals)
其次,将vals
放入带坐标的新data.table
:
vals_dt<-data.table(x=rep(1:dim(vals)[1],dim(vals)[2]),
y=rep(1:dim(vals)[2],each=dim(vals)[1]),
z=matrix(vals,ncol=1)[,1],key=c("x","y"))
现在合并:
setkey(dt1,x,y)[vals_dt,z:=z]
答案 3 :(得分:1)
您还可以尝试使用data.table
包并通过引用更新df1
library(data.table)
setDT(df1)[, z := df2[cbind(x, y)]][]
# x y z
# 1: 1 1 8
# 2: 2 3 3
# 3: 3 1 5
# 4: 4 2 8
# 5: 3 4 8