/ / Wypełnij data.frame danymi z data.frame starszej obserwacji - r, drzewo, porównaj

Wypełnij data.frame danymi z data.frame starszej obserwacji - r, drzewo, porównaj

Mam 2 dane.ramki z obserwacjami, w większości te same wątki, ale jeden jest z tego roku i jeden z 2012 roku. Używam R studio na Windows7. Co chcę: Utwórz nową kolumnę w nowym data.frame o średnicy drzew 5 lat temu Jak tego chcę: R porówna dane 2 data.frames, a jeśli lokalizacja i identyfikator drzewa w obu przypadkach przekopiuje średnicę danych.frame z 2012 roku w nowej kolumnie utworzonej w ostatnim. Mój dotychczasowy kod to:

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

Mój problem: R to robi. Ale te dwie dane.ramki nie są identyczne. W 2012 roku niektóre drzewa nie były brane pod uwagę, ponieważ wyglądały na chore, ale teraz są jeszcze żywe i zmierzyłem je, zamiast tego inne drzewa są martwe, mam 10 działek, na przykład moje dane i mój kod wygląda jak :

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)

Tak więc na koniec mam

> 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

Moje pytania: Dlaczego drzewo 2 nie ma bazy danych? Dlaczego drzewo 3 ma bazę danych? Czy R tylko kopiuje je bez względu na identyfikator? Gdzie jest mój błąd?

Odpowiedzi:

-1 dla odpowiedzi nr 1

Możemy zrobić join on"LOC" i "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

W kodzie OP "tylko podzbiór" ID "opiera się na wartości" LOC ", a nie jest match"ID" między dwoma zestawami danych. The %in% zwraca wektor logiczny i jeśli kolejność jest niepoprawna i przypisuje wartości w oparciu o kolejność występowania wartości, a nie od rzeczywistego dopasowania "ID"

Tak, tutaj możemy użyć 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