在以下数据集中,我想将列Size
中的值乘以Month1
列,Month2
或Month3
中的值,具体取决于我们在列中的数字Month
。因此,如果在某一行中Month
值为2,我想将列Size
中的值乘以Month2
列中的值,并将结果保存在新列{{1}中}。非常感谢您的帮助!
NewSize
答案 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
中的匹配行。在这些匹配的行上,我们通过为那些匹配的行提取NewSize
和Size
并将它们相乘来计算MonthX
。我们使用get()
来提取正确的MonthX
列。
by=.EACHI
顾名思义,为每个j
执行i
中的表达式。例如,i=1
匹配(或加入)df
的行1:3。对于这些行,j-expression提取Size = 30,20,10
和Month1 = 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)]