将列值乘以另一个值,具体取决于某列R中的值

时间:2015-04-17 21:00:22

标签: r rows dplyr

在以下数据集中,我想将列Size中的值乘以Month1列,Month2Month3中的值,具体取决于我们在列中的数字Month。因此,如果在某一行中Month值为2,我想将列Size中的值乘以Month2列中的值,并将结果保存在新列{{1}中}。非常感谢您的帮助!

NewSize

4 个答案:

答案 0 :(得分:2)

以下是我使用data.table处理此问题的方法。

require(data.table)
setkey(setDT(df), 
      Month)[.(mon = 1:3),                          ## i
      NewSize := Size * get(paste0("Month", mon)),  ## j
      by=.EACHI]                                    ## by
  • setDT通过引用将df data.frame 转换为 data.table
  • setkey按指定的列Month按递增顺序重新排序 data.table ,并将该列标记为 key 列,我们将在其上进行加入。
  • 我们使用值1:3对上一组中的键列集执行连接。这也可以解释为子集操作,该操作从关键列1,2 and 3中提取与Month匹配的所有行。

  • 因此,对于1:3的每个值,我们计算i中的匹配行。在这些匹配的行上,我们通过为那些匹配的行提取NewSizeSize并将它们相乘来计算MonthX。我们使用get()来提取正确的MonthX列。

  • by=.EACHI顾名思义,为每个j执行i中的表达式。例如,i=1匹配(或加入)df的行1:3。对于这些行,j-expression提取Size = 30,20,10Month1 = 1.0, 0.2, 0.0,并对其进行求值以返回30, 4, 0。然后是i=2等等..

希望即使您只是在寻找dplyr答案,这也会有所帮助。

答案 1 :(得分:1)

这是使用ifelse

的另一种选择
> transform(df, NewSize=ifelse(Month==1, Size*Month1, 
                  ifelse(Month==2, Size*Month2, Size*Month3)))
  Orig Dest Month Size Month1 Month2 Month3 NewSize
1    A    B     1   30    1.0    0.6    0.0      30
2    B    A     1   20    0.2    1.0    1.0       4
3    A    C     1   10    0.0    0.0    0.6       0
4    A    B     2   10    1.0    0.6    0.0       6
5    B    A     2   20    0.2    1.0    1.0      20
6    A    C     2   20    0.0    0.0    0.6       0
7    A    B     3   30    1.0    0.6    0.0       0
8    B    A     3   50    0.2    1.0    1.0      50
9    A    C     3   20    0.0    0.0    0.6      12

答案 2 :(得分:1)

您可以使用apply

apply(df, 1, function(u) as.numeric(u[paste0('Month', u['Month'])])*as.numeric(u['Size']))
#[1] 30  4  0  6 20  0  0 50 12

或矢量化解决方案:

bool = matrix(rep(df$Month, each=3)==rep(1:3, nrow(df)), byrow=T, ncol=3)

df[c('Month1', 'Month2', 'Month3')][bool] * df$Size
#[1] 30  4  0  6 20  0  0 50 12

答案 3 :(得分:1)

在基础R中,完全矢量化:

 df$Size*df[,5:7][cbind(1:nrow(df),df$Month)]