【问题标题】:populate values from another data frame based on predefined set of columns根据预定义的列集从另一个数据框中填充值
【发布时间】:2021-02-04 20:17:43
【问题描述】:

我有两个数据框。第一个看起来像这样:

df1 <- data.frame(Hugo_Symbol=c("CDKN2A", "JUN", "IRS2","MTOR",
                           "NRAS"),
                  A183=c(-0.19,NA,2.01,0.4,1.23),
                  A185=c(0.11,2.45,NA,NA,1.67),
                  A186=c(1.19,NA,2.41,0.78,1.93),
                  A187=c(2.78,NA,NA,0.7,2.23),
                  A188=c(NA,NA,NA,2.4,1.23))
head(df1)
  Hugo_Symbol  A183 A185 A186 A187 A188
1      CDKN2A -0.19 0.11 1.19 2.78   NA
2         JUN    NA 2.45   NA   NA   NA
3        IRS2  2.01   NA 2.41   NA   NA
4        MTOR  0.40   NA 0.78 0.70 2.40
5        NRAS  1.23 1.67 1.93 2.23 1.23

第二个数据框更小并且有一个空值:

df2 <- data.frame(Hugo_Symbol=c("CDKN2A", "IRS2", "NRAS"),
                  A183=c(0, 0, 0),
                  A187=c(0, 0, 0),
                  A188=c(0, 0, 0))
head(df2)
  Hugo_Symbol A183 A187 A188
1      CDKN2A    0    0    0
2        IRS2    0    0    0
3        NRAS    0    0    0

我想用第一个数据帧中的值填充第二个数据帧。最终结果将如下所示:

  Hugo_Symbol  A183 A187 A188
1      CDKN2A -0.19 2.78 NA
2        IRS2  2.01 NA   NA
3        NRAS  1.23 2.23 1.23

我尝试了 cbind()merge() 函数,但它们不适用于具有不同数量的原始数据和列的数据。

我将不胜感激!

谢谢! 奥尔哈

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    我不明白你输出的逻辑,我希望你写错了,但我认为你想要以下内容:

    matchedRowInds <- match(df2$Hugo_Symbol,df1$Hugo_Symbol)
    matchedColInds <- match(colnames(df2),colnames(df1))
    newdf <- df1[matchedRowInds,matchedColInds]
    
    # > newdf
    #   Hugo_Symbol  A183 A187 A188
    # 1      CDKN2A -0.19 2.78   NA
    # 3        IRS2  2.01   NA   NA
    # 5        NRAS  1.23 2.23 1.23
    

    想法:获取较大数据框中存在的较小数据框中的匹配行。与列相同。

    【讨论】:

      【解决方案2】:

      您可以使用 dplyr 中的 semi_join: 你的决赛桌有意想不到的价值。 我的版本:

      library(dplyr)
      df3 <- df1 %>%  semi_join(df2, by="Hugo_Symbol") %>% 
        select(Hugo_Symbol, A183, A187, A188)
      

      【讨论】:

        【解决方案3】:

        这是一种 data.table 方法...您确定问题中的期望输出是正确的吗?在我看来 IRS2 - A188 应该是 NA 而不是 2.23?

        library( data.table )
        #make them both data.tables
        setDT(df1); setDT(df2)
        #find the common columns
        comcols <- intersect( names(df1[,-1]), names(df2[,-1]) )
        #create a data.table syntax for an update join on the common columns
        expr <- paste0( "df2[ df1, `:=` (", 
                         paste0( comcols, " = i.", comcols, collapse = " ," ), 
                         " ), on = .(Hugo_Symbol) ]" )
        eval(parse(text=expr))
        
        df2
        #    Hugo_Symbol  A183 A187 A188
        # 1:      CDKN2A -0.19 2.78   NA
        # 2:        IRS2  2.01   NA   NA
        # 3:        NRAS  1.23 2.23 1.23
        

        【讨论】:

        • 当我在更大的数据集上运行时,这给了我 TRUE 语句而不是实际值。
        猜你喜欢
        • 1970-01-01
        • 2020-11-26
        • 1970-01-01
        • 1970-01-01
        • 2018-12-08
        • 2016-02-14
        • 2020-01-10
        • 2021-09-24
        • 1970-01-01
        相关资源
        最近更新 更多