R - 将行与行匹配,将行与行匹配以在两个数据帧之间拉取元素

时间:2016-09-26 16:14:08

标签: r indexing dataframe

我有两个数据框" df1"和" df2"。

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)

我想在df1中将药物名称与df2中的药物名称交叉引用,然后将水平(1,2或3)与df2中的列匹配(std1为1级,std2为2级,等等)并从df2中提取金额(100,200或300)并将其添加为名为&#34; Amount&#34;的df1中的新列。

我还没能确定如何根据一个数据帧的行与另一个数据帧的行和列交叉引用,以从第二个数据帧中提取相关元素。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

以下是首次将df2重新定义为长格式的一种可能方式,在创建std的同时将df1和joinig剥离回Amount(使用{{1 }})

data.table

答案 1 :(得分:1)

以下是使用gather/left_join

dplyr/tidyr的选项
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