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