/ / Rellene data.frame con datos de un data.frame de una observación más antigua - r, tree, compare

Llene data.frame con datos de un data.frame de una observación anterior - r, tree, compare

Tengo 2 datos.Marcos con observaciones, la mayoría de las mismas parcelas, pero una es de este año y otra de 2012. Estoy usando R studio en Windows7. Lo que quiero: crear una nueva columna en el nuevo data.frame con el diámetro de los árboles hace 5 años Cómo lo deseo: R comparará los 2 cuadros de datos, y Si la ubicación y la identificación del árbol se calculan en ambos, copiará el diámetro del cuadro de datos de 2012 en la nueva columna creada de la reciente. Mi código hasta ahora es:

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

Mi problema es: R lo está haciendo. Pero, los dos datos.Los marcos no son idénticos. En 2012, algunos de los árboles no han sido considerados porque parecían enfermos, pero ahora siguen vivos y los medí. En cambio, otros árboles están muertos. Tengo 10 parcelas. Como ejemplo, mis datos y mi código parecen :

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)

Así que al final tengo

> 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

Mis preguntas: ¿Por qué el árbol 2 no tiene dbh? ¿Por qué el árbol 3 tiene un dbh? ¿R solo los copia cualquiera que sea la ID? ¿Dónde está mi error?

Respuestas

-1 para la respuesta № 1

Podemos hacer una unión on, "LOC" y "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

En el código OP ", solo se está subcontratando" ID "en función del valor" LOC "y no está matchIngrese la "ID" entre los dos conjuntos de datos. los %in% devuelve un vector lógico y si el orden no es correcto y asignará los valores según el orden de aparición de los valores y no en la coincidencia real de "ID"

Entonces, aquí podemos usar 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