2017-06-10 42 views
0

我有兩個data.frames,包含觀察數據,大部分是相同的圖表,但一個來自今年,一個來自2012.我在R studio上使用Windows 7的。 我想要的是:在新的data.frame中創建一個新的列,其中包含5年前的樹的直徑 我是如何需要的:R將比較2個data.frames,並且如果位置和樹ID在兩個它應該複製最近一個新創建列中的2012年data.frame的直徑。 到目前爲止我的代碼是:使用舊數據的data.frame中的數據填充data.frame

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

我的問題是,R是做什麼的。但是,這兩個數據幀並不完全相同。 2012年,有些樹木因爲看起來不舒服而未被考慮,但現在它們還活着,我測量了它們。相反,其他樹木已經死亡。我有10塊地塊。作爲例子,我的數據,我的代碼如下所示:

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) 

所以在最後我有

> 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 

我的問題:爲什麼樹2沒有胸徑?爲什麼樹3有一個dbh? R是否只是複製它們,無論ID是什麼?我的錯誤在哪裏?

回答

-1

我們可以做一個加入on, 「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

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 
+0

令人驚歎!而且這不僅僅是爲了位置1,所有10個位置都是用這一行完成的!萬分感謝! (只是好奇心,爲什麼我的代碼沒有工作?) – Qiyuan

+0

@Qiyuan我還更新了您正在開發的基礎R解決方案 – akrun