2016-09-26 4 views
0

Ich habe zwei Datenrahmen "df1" und "df2".R - Match Zeile zu Zeile und Zeile zu Spalte zu Element zwischen zwei Datenrahmen ziehen

drugs<-c("Drug1", "Drug1", "Drug1", "Drug2", "Drug2", "Drug2") 
level<-c("1", "2", "3", "1", "2", "3") 
df1<-data.frame(drugs, level) 

standards<-c("Drug1", "Drug2") 
std1<-c("100", "100") 
std2<-c("200", "200") 
std3<-c("300", "300") 
df2<-data.frame(standards, std1, std2, std3) 

Ich mag Querverweis die Medikamentennamen in df1 mit dem Medikamentennamen in DF2, dann die Ebene entspricht (1, 2, oder 3) mit der Säule in DF2 (STD1 mit Ebene 1, STD2 mit Level 2, usw.) und ziehe den Betrag (100, 200 oder 300) von df2 und füge ihn als neue Spalte in df1 mit dem Namen "Amount" hinzu.

Ich konnte nicht bestimmen, wie ich Verweis basierend auf Zeilen eines Datenframes mit der Zeile und Spalte eines anderen Datenrahmens verknüpfen kann, um das zugeordnete Element aus diesem zweiten Datenrahmen zu ziehen.

Irgendwelche Vorschläge?

Antwort

2

Hier Eine Möglichkeit, erste df2 zu einem langen Format Umformen, Abstreifen der std und joinig zurück zu df1 während Amount an Ort und Stelle zu schaffen (mit data.table)

library(data.table) 
tmp <- melt(setDT(df2), 1)[, level := sub("std", "", variable, fixed = TRUE)] 
setDT(df1)[tmp, Amount := value, on = c(drugs = "standards", "level")] 
df1 
# drugs level Amount 
# 1: Drug1  1 100 
# 2: Drug1  2 200 
# 3: Drug1  3 300 
# 4: Drug2  1 100 
# 5: Drug2  2 200 
# 6: Drug2  3 300 
1

Hier ist eine Option gather/left_join von dplyr/tidyr

mit
library(dplyr) 
library(tidyr) 
rename(df2, drugs=standards) %>% #change the column name 
      gather(level, Amount, std1:std3) %>% #convert from wide to long 
      extract(level, into = "level", "(\\d+)") %>% #extract the numeric part 
      left_join(df1, .) #do a join 
# drugs level Amount 
#1 Drug1  1 100 
#2 Drug1  2 200 
#3 Drug1  3 300 
#4 Drug2  1 100 
#5 Drug2  2 200 
#6 Drug2  3 300 
Verwandte Themen