我有这个代码在R中进行一系列的乘法和加法。有人可以给我一个建议,使用* apply来使它更整洁更短吗?
我用“系列”,“乘法”这样的关键词环顾四周,但没有到达任何地方。如果此问题已经发布,请告诉我相关链接。谢谢。
df1n是data.frame
,其中包含> 78个变量和215个观察值。
dff[,3]<-(df1n[5]*((df1n[25]*df1n[26]*df1n[27]) + (df1n[28]*df1n[29]*df1n[30]) +
(df1n[31]*df1n[32]*df1n[33]) + (df1n[34]*df1n[35]*df1n[36]) +
(df1n[37]*df1n[38]*df1n[39]) + (df1n[40]*df1n[41]*df1n[42]) +
(df1n[61]*df1n[62]*df1n[63]) + (df1n[64]*df1n[65]*df1n[66]) +
(df1n[67]*df1n[68]*df1n[69]) + (df1n[70]*df1n[71]*df1n[72]) +
(df1n[73]*df1n[74]*df1n[75]) + (df1n[76]*df1n[77]*df1n[78]))
)
此致 ikel
答案 0 :(得分:3)
我使用lapply()
来构建每个(A*B*C)
件的索引列表。然后,将这些索引传递给sapply
,从df1n
中提取每组元素,并将它们与prod()
相乘。其余的是不言自明的:
df1n <- 1:100
ll <- lapply(c(seq(25, 40, by=3), seq(61, 76, by=3)),
function(X) seq(X, by=1, length.out=3))
df1n[5] * sum(sapply(ll, function(i) prod(df1n[i])))
# [1] 11439180
编辑:现在我知道df1n
的每个元素都是长度为215的向量,这里是我建议的代码:
# Example data (a list in which each element is a vector of length 215).
x <- replicate(100, 1:215, simplify=FALSE)
ll <- lapply(seq(25, 76, by=3), function(X) seq(X, by=1, length.out=3))
res <- x[[5]] * rowSums(sapply(ll, function(i) Reduce("*", x[i])))
str(res)
# num [1:215] 18 288 1458 4608 11250 ...
答案 1 :(得分:2)
以下是对Josh解决方案的修改,该解决方案在下面的示例数据中生成与原始代码相同的输出。
# Some sample data
df1n <- as.data.frame( lapply(1:80, function(i) seq(i, len=5)) )
df1n[5] * rowSums(sapply(c(seq(25,40,3), seq(61,76,3)),
function(i) df1n[[i]]*df1n[[i+1]]*df1n[[i+2]]))
# c.5..6..7..8..9.
#1 11439180
#2 14386680
#3 17580528
#4 21032640
#5 24755220