根据另一个data.frame中的坐标从data.frame中提取数据

时间:2015-04-19 21:52:59

标签: r dataframe coordinates rows

所以这就是我的问题所在。我有一个非常大的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。)

4 个答案:

答案 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解决方案:( df1df2是坐标和数字作为数据框):

 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