【问题标题】:Multiply each value of a dataframe by a row of another dataframe searched by id将数据帧的每个值乘以通过 id 搜索的另一个数据帧的行
【发布时间】:2019-08-20 14:10:22
【问题描述】:

我是 R 新手,我已经尝试了很多来解决这个问题,如果有人可以帮助我,我将非常感激!这是我的问题:

我有两个数据框(df1 和 df2),我需要将 df1 的每个值乘以通过 id 搜索的一行 df2。这是我正在寻找的示例:

df1<-data.frame(ID=c(1,2,3), x1=c(6,3,2), x2=c(2,3,1), x3=c(4,10,7))
df1
df2<-data.frame(ID=c(1,2,3), y1=c(0.01,0.02,0.05), y2=c(0.2,0.03,0.11), y3=c(0.3,0.09,0.07))
df2

#Example of what I need
df1xdf2<- data.frame(ID=c(1,2,3), r1=c(0.06,0.06,0.1), r2=c(1.2,0.09,0.22), r3=c(1.8,0.27,0.14),
                     r4=c(0.02,0.06,0.05),r5=c(0.4,0.09,0.11),r6=c(0.6,0.27,0.07),r7=c(0.04,0.2,0.35),r8=c(0.8,0.3,0.77),r9=c(1.2,0.9,0.49))

df1xdf2

我尝试过按行和列循环,但我只得到 1x1 乘法。

我的数据框具有相同数量的行、列和因子名称。我现实生活中的数据框要大得多,包括行和列。 有人知道怎么解决吗?

【问题讨论】:

    标签: r dataframe multiplication


    【解决方案1】:

    您可以使用lapplydf1 的每一列与完整的df2 相乘。我们可以一起cbind 数据框并重命名列

    output <- do.call(cbind, lapply(df1[-1], `*`, df2[-1]))
    cbind(df1[1], setNames(output, paste0("r", seq_along(output))))
    
    #  ID   r1   r2   r3   r4   r5   r6   r7   r8   r9
    #1  1 0.06 1.20 1.80 0.02 0.40 0.60 0.04 0.80 1.20
    #2  2 0.06 0.09 0.27 0.06 0.09 0.27 0.20 0.30 0.90
    #3  3 0.10 0.22 0.14 0.05 0.11 0.07 0.35 0.77 0.49
    

    【讨论】:

      【解决方案2】:

      你可以使用 dplyr 包

      #Example with dplyr
      
      require(dplyr)
      # First we use merge() to join both DF
      result <- merge(df1, df2, by = "ID") %>% 
        mutate(r1 = x1*y1,
               r2 = x1*y2,
               r3 = etc.)
      

      在 mutate() 中,您可以指定新的列公式和名称

      【讨论】:

      • 我的问题是我需要按行而不是按列。通过该合并,我将列 x1 和 y1 相乘,并且我需要 df2 的行乘以每个值(按 ID 搜索)
      【解决方案3】:

      map 的选项

      library(tidyverse)
      bind_cols(df1[1], map_dfc(df1[-1], `*`, df2[-1]))
      

      或在base R 中复制列并相乘

      out <- cbind(df1[1], df1[-1][rep(seq_along(df1[-1]), each = 3)] *
               df2[-1][rep(seq_along(df2[-1]), 3)])
      names(out)[-1] <- paste0("r", seq_along(out[-1]))
      
      out
      #  ID   r1   r2   r3   r4   r5   r6   r7   r8   r9
      #1  1 0.06 1.20 1.80 0.02 0.40 0.60 0.04 0.80 1.20
      #2  2 0.06 0.09 0.27 0.06 0.09 0.27 0.20 0.30 0.90
      #3  3 0.10 0.22 0.14 0.05 0.11 0.07 0.35 0.77 0.49
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-30
        • 1970-01-01
        • 2015-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多