2016-10-13 2 views
-2

Ich versuche eine skalierbare Lösung zu finden, um ein data.frame basierend auf einem anderen data.frame zu aktualisieren. Hier ist ein minimales Beispiel:R update df1 Werte basierend auf df2 in einem anderen Format

df1 <- data.frame(cbind(c("a","b","b","b","c"),c(1,1,1,2,2),as.numeric(c(0.2,0.6,0.6,0.8,0.4)))) 
colnames(df1) <- c("ID1", "ID2","Value") 

> df1 
    ID1 ID2 Value 
1 a 1 0.2 
2 b 1 0.6 
3 b 1 0.6 
4 b 2 0.8 
5 c 2 0.4 

df2 <- data.frame(cbind(2),0,0.45,0.5) 
colnames(df2) <- c("ID2", "a","b","c") 

> df2 
    ID2 a b c 
1 2 0 0.45 0.5 

Nun möchte Ich mag die Werte von DF1 aktualisieren, indem df2 Werte mit dem folgenden Ergebnisse zu erhalten:

ID1 ID2 Value 
1 a 1 0.2 
2 b 1 0.6 
3 b 1 0.6 
4 b 2 0.45 
5 c 2 0.5 

Kann jemand auf diesem helfen?

Antwort

0

Zunächst einmal loslassen cbind beim Erstellen Ihrer Datensätze, so dass es nicht zuerst in Matrix konvertieren und die Klassen durcheinander bringen.

df1 <- data.frame(c("a","b","b","b","c"),c(1,1,1,2,2),c(0.2,0.6,0.6,0.8,0.4)) 
colnames(df1) <- c("ID1", "ID2","Value") 
df2 <- data.frame(2,0,0.45,0.5) 
colnames(df2) <- c("ID2", "a","b","c") 

Dann würde ich Ihre zweite Datensatz zu einem langen Format zuerst konvertieren und dann an Ort und Stelle aktualisieren df1

library(data.table) #v>=1.9.6 
ldf2 <- melt(setDT(df2), 1) 
setDT(df1)[ldf2, Value := i.value, on = c(ID1 = "variable", ID2 = "ID2")] 
df1 
# ID1 ID2 Value 
# 1: a 1 0.20 
# 2: b 1 0.60 
# 3: b 1 0.60 
# 4: b 2 0.45 
# 5: c 2 0.50 
Verwandte Themen