我是R的新手。
我想乘以数据帧的列。这种类型的问题必须非常基础,但是我是RI的新手,因为输入数据如下
Id Name quantity
Id1 Name1 200
Id2 Name2 300
Id3 Name3 500
Id4 Name4 400
Name BonusMultiplier
Name1 1
Name2 2
Name3 3
Name4 2
Date Name1 Name2 Name3 Name4
12/3/2014 20.5 200.3 56.3 550.6
12/2/2014 21.5 180.3 60.5 556.2
12/1/2014 19.6 190.0 61.6 559.6
11/30/2014 15.6 195.6 62.6 580.8
我想要的输出应该像
Date Name1 Name2 Name3 Name4
12/3/2014 20.5*200*1 200.3*300*2 56.3*500*3 550.6*400*2
12/2/2014 21.5*200*1 180.3*300*2 60.5*500*3 556.2*400*2
12/1/2014 19.6*200*1 190.0*300*2 61.6*500*3 559.6*400*2
11/30/2014 15.6*200*1 195.6*300*2 62.6*500*3 580.8*400*2
编辑
如果输出像
Date Id1 Id2 Id3 Id4
12/3/2014 20.5*200*1 200.3*300*2 56.3*500*3 550.6*400*2
12/2/2014 21.5*200*1 180.3*300*2 60.5*500*3 556.2*400*2
12/1/2014 19.6*200*1 190.0*300*2 61.6*500*3 559.6*400*2
11/30/2014 15.6*200*1 195.6*300*2 62.6*500*3 580.8*400*2
您可以尝试Map
(假设数据集是有序的)
df3[,-1] <- Map(function(x,y,z) x*y*z,
df3[,-1], df2$BonusMultiplier, df1$quantity)
df3
# Date Name1 Name2 Name3 Name4
#1 12/3/2014 4100 120180 84450 440480
#2 12/2/2014 4300 108180 90750 444960
#3 12/1/2014 3920 114000 92400 447680
#4 11/30/2014 3120 117360 93900 464640
另一种选择是在将第三个数据集转换为格式后merge
(使用Reduce
)数据集,然后使用创建列,最后将表单转换为格式。long
melt
mutliplied
transform
long
wide
dcast
library(reshape2)
lst <- list(setNames(melt(df3, id.var='Date'),
c('Date', 'Name', 'value')), df1, df2)
dcast(
transform(
Reduce(function(...) merge(..., by='Name'), lst),
value=value*quantity*BonusMultiplier)[,1:3],
Date~Name, value.var='value')
df1 <- tructure(list(Id = 1:4, Name = c("Name1", "Name2", "Name3",
"Name4"), quantity = c(200L, 300L, 500L, 400L)), .Names = c("Id",
"Name", "quantity"), class = "data.frame", row.names = c(NA, -4L))
df2 <- structure(list(Name = c("Name1", "Name2", "Name3", "Name4"),
BonusMultiplier = c(1L, 2L, 3L, 2L)), .Names = c("Name",
"BonusMultiplier"), class = "data.frame", row.names = c(NA, -4L))
df3 <- structure(list(Date = c("12/3/2014", "12/2/2014", "12/1/2014",
"11/30/2014"), Name1 = c(20.5, 21.5, 19.6, 15.6), Name2 = c(200.3,
180.3, 190, 195.6), Name3 = c(56.3, 60.5, 61.6, 62.6), Name4 = c(550.6,
556.2, 559.6, 580.8)), .Names = c("Date", "Name1", "Name2", "Name3",
"Name4"), class = "data.frame", row.names = c(NA, -4L))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句