使用旧观测值的data.frame中的数据填充data.frame

使用旧观测值的data.frame中的数据填充data.frame,r,tree,compare,R,Tree,Compare,我有两个数据框架和观察结果,大部分是相同的图,但一个来自今年,一个来自2012年。我正在Windows7上使用R studio。 我想要的是:在新的data.frame中创建一个新列,其直径为5年前的树木直径 我想要的方式:R将比较2个data.frames,如果位置和树ID两者匹配,则将在最近创建的列中复制2012的data.frames的直径。 到目前为止,我的代码是: df17$dbh12[df17$LOC=="1"] <- ifelse((df12$ID[df12$LOC=="1"

我有两个数据框架和观察结果,大部分是相同的图,但一个来自今年,一个来自2012年。我正在Windows7上使用R studio。 我想要的是:在新的data.frame中创建一个新列,其直径为5年前的树木直径 我想要的方式:R将比较2个data.frames,如果位置和树ID两者匹配,则将在最近创建的列中复制2012的data.frames的直径。 到目前为止,我的代码是:

df17$dbh12[df17$LOC=="1"] <- ifelse((df12$ID[df12$LOC=="1"]) %in% (df17$ID[df17$LOC=="1"]), df12$DBH[df12$LOC=="1"], NA)
我的问题:为什么树2没有胸径?为什么树3有一个胸径?R只是在复制他们的身份证吗?我的错误在哪里?

我们可以在、LOC和ID上进行连接

library(data.table)
setDT(df2017)[df2012, dbh12 := i.DBH, on = .(LOC, ID)]
df2017
#   LOC ID  DBH dbh12
#1:   1  2  7.8  7.50
#2:   1  3 28.7    NA
#3:   1  4 10.3 10.25
#4:   1  5 13.7 14.50
#5:   1  6  7.8  6.75
在OP代码中,它只是基于“LOC”值对“ID”进行子集设置,并且与两个数据集之间的“ID”不匹配。%in%返回一个逻辑向量,如果顺序不正确,它将根据值的出现顺序而不是“ID”的实际匹配来分配值

所以,这里我们可以使用match


太神了这不仅仅是为位置1做的,所有10个位置都是用这一行完成的!多谢各位!出于好奇,为什么我的代码不起作用?@Qiyuan我还更新了你正在使用的base R解决方案
> df2017
  LOC ID  DBH dbh12
    1  2  7.8    NA
    1  3 28.7  7.50
    1  4 10.3 10.25
    1  5 13.7 14.50
    1  6  7.8  6.75
library(data.table)
setDT(df2017)[df2012, dbh12 := i.DBH, on = .(LOC, ID)]
df2017
#   LOC ID  DBH dbh12
#1:   1  2  7.8  7.50
#2:   1  3 28.7    NA
#3:   1  4 10.3 10.25
#4:   1  5 13.7 14.50
#5:   1  6  7.8  6.75
i1 <- with(df2017, match(ID[LOC==1], with(df2012, ID[LOC==1])))
df2017$dbh12 <- df2012$DBH[i1]
df2017$dbh12
#[1]  7.50    NA 10.25 14.50  6.75