【问题标题】:R - Match row to row and row to column to pull element between two dataframesR - 匹配行到行和行到列以在两个数据帧之间拉取元素
【发布时间】:2016-09-26 16:14:08
【问题描述】:

我有两个数据框“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)并将其添加为 df1 中名为“Amount”的新列。

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

有什么建议吗?

【问题讨论】:

    标签: r indexing dataframe


    【解决方案1】:

    这是一种可能的方法,首先将df2 重塑为长格式,剥离std 并加入df1,同时在适当位置创建Amount(使用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
    

    【讨论】:

      【解决方案2】:

      这是一个使用来自dplyr/tidyrgather/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
      

      【讨论】:

        猜你喜欢
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 2017-05-09
        • 2012-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-06
        相关资源
        最近更新 更多