基于匹配的行/列组合 R

时间:2021-05-21 15:52:37

标签: r dataframe dplyr

如果我有一个数据帧 (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] 等等....

1 个答案:

答案 0 :(得分: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]