使用来自旧观察的data.frame的数据填充data.frame

时间:2017-06-10 11:53:24

标签: r tree compare

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

import re

rgx540600 = re.compile(r'^(?:5[4-9]\d|600)$')

def valid_num(num):
    return bool(rgx540600.match(str(num)))

我的问题是:R正在这样做。但是,这两个data.frames并不完全相同。在2012年,一些树木没有被考虑,因为他们看起来病了,但现在他们还活着,我测量了它们。相反,其他树木已经死了。我有10个情节。例如,我的数据和我的代码如下:

df17$dbh12[df17$LOC=="1"] <- ifelse((df12$ID[df12$LOC=="1"]) %in% (df17$ID[df17$LOC=="1"]), df12$DBH[df12$LOC=="1"], NA)

所以最后我有

df2012=data.frame(LOC=1, ID=c(1,2,4,5,6), DBH=c(7.0, 7.5, 10.25, 14.5, 6.75))
df2017=data.frame(LOC=1, ID=c(2,3,4,5,6), DBH=c(7.8, 28.7, 10.3, 13.7, 7.8))

df2017$dbh12[df2017$LOC=="1"] <- ifelse((df2012$ID[df2012$LOC=="1"]) %in% (df2017$ID[df2017$LOC=="1"]), df2012$DBH[df2012$LOC=="1"], NA)

我的问题:为什么树2没有dbh?为什么树3有一个dbh? R只是复制它们而不管ID是什么?我的错误在哪里?

1 个答案:

答案 0 :(得分:-1)

我们可以加入on,&#34; LOC&#34;和&#34; ID&#34;

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&#39;代码,它只是子集&#39; ID&#39;基于&#39; LOC&#39;价值而不是match&#39; ID&#39;两个数据集之间。 %in%返回逻辑向量,如果订单不正确,它将根据值的出现顺序而不是实际匹配的ID来分配值。

所以,我们可以使用match

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