我有两个数据框" 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中的新列。
我还没能确定如何根据一个数据帧的行与另一个数据帧的行和列交叉引用,以从第二个数据帧中提取相关元素。
有什么建议吗?
答案 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