2016-09-26 9 views
0

"df1"と "df2"という2つのデータフレームがあります。R - 2つのデータフレーム間で要素を引っ張るために、行と行とを一致させる

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) 

Iは、次いでレベルと一致し、DF2における薬物名でDF1クロスリファレンスに薬剤名が欲しい(1、2、または3)レベル1とDF2の列を有する(STD1、STD2とレベル2など)、df2から量(100,200,300)を引き出し、df1の "Amount"という新しい列として追加します。

1つのデータフレームの行と別のデータフレームの行とを基準にして、どのように参照すると、その第2のデータフレームから関連する要素を引き出すことができないのですか。

提案がありますか?ここで

答えて

2

はここ

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

data.tableを使用して)最初に、長い形式にdf2を再形成stdを除去し、所定の位置にAmountを作成しながら、バックdf1にjoinigの一つの可能​​な方法だdplyr/tidyr

から gather/left_joinを使用してオプションです。
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 
関連する問題