【问题标题】:multiply the cells of one dataframe by another based on matching row/column combination R基于匹配的行/列组合 R 将一个数据帧的单元格乘以另一个数据帧的单元格
【发布时间】:2021-08-10 21:04:13
【问题描述】:

如果我有一个数据帧 (df1),并且我想根据匹配的列和行 ID 将数据帧的每个单元格乘以第二个数据帧 (df2) 的单元格,我该怎么做?

df1:

df1<-data.frame(id=rep(1:100),
               Room1=rnorm(100,0.4,0.5),
               Room2=rnorm(100,0.3,0.5),
               Room3=rnorm(100,0.7,0.5))

df2:

df2<-data.frame(id=rep(1:100),
               Room1=rnorm(100,1,7),
               Room2=rnorm(100,12,13),
               Room3=rnorm(100,4,20))

所以输出是一个数据帧 (df3),其中 df1 的第 1 行第 2 列中的值(例如 df1[1,2])乘以 df2 中的等效值(例如 df2[1,2])和df1[2,2]*df2[2,2]等......

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    如果它们都具有相同的“id”(基于显示的示例)并且顺序相同,我们可以简单地将两个大小相等的数据集相乘并将输出分配回原始数据,即“df1”

    df1[-1] <- df1[-1] * df2[-1]
    

    意味着,我们正在选择除第一个 (df1[-1]) 之外的列,并乘以第二个数据 (df2[-1]) 中的同一组列,并将输出分配回以反映第一个数据集中的变化


    假设该示例是一个简单的用例,它不是 OP 的原始数据,即其中一个(或两者)缺少一些“id”,我们只想匹配和相乘那些存在于“df1”中的数据,一个选项是通过“id”连接,然后进行乘法运算(假设两个数据集具有相同的列名,即“Room1”、“Room2”、“Room3”

    library(data.table)
    nm1 <- names(df1)[-1]
    nm2 <- paste0('i.', nm1)
    setDT(df1)[df2, (nm1) := Map(`*`, .SD, mget(nm2))on = .(id), .SDcols = nm1] 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多