私は2つのデータを持っています。フレームは、ほとんど同じプロットが観測されますが、1つは今年と2012年のものです。私はWindows7上でR studioを使用しています。 私が望むもの:5年前の樹木の直径を使って、新しいdata.frameに新しい列を作成する 私はそれをどのようにしたいのですか?Rは2つのdata.framesを比較し、両方の場所とツリーIDのマッチが最近作成された新しい列の2012年の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はそれをやっている。しかし、2つのデータ。フレームは同一ではありません。 2012年にはいくつかの樹木が病気になっていると考えられていませんでしたが、今はまだ生きていて測定しましたが、代わりに他の樹木は死んでいます。 :
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にdbhがないのはなぜですか?ツリー3にdbhがある理由RはIDが何であってもそれらをコピーしていますか?私のミスはどこですか?
回答:
回答№1の場合は-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 "をサブセット化するだけで、 match
2つのデータセット間の「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