【问题标题】:Shortening vectors (within a data.frame) mutiplication code in RR中的缩短向量(在data.frame内)乘法代码
【发布时间】:2012-01-31 20:53:21
【问题描述】:

我有这段代码可以在 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]))
         )

问候, 伊克尔

【问题讨论】:

  • 数组索引有什么逻辑吗?你想达到什么目的?
  • 嗨萌,这是一个根据data.frame中的其他值计算值的公式。我能想到的唯一逻辑是它从 25 开始,然后对下一个 3 列进行乘法,然后添加到三列的下一个乘法,直到 40。然后它再次开始查看 61 并重复相同的模式直到第 76 列。我希望这很清楚。我不知道这叫做数组索引。谢谢你。

标签: r vector matrix dataframe


【解决方案1】:

我会使用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 ...

【讨论】:

  • 嗨乔希,很短~!我会试一试,很快就会通知你~
  • @ikel -- 我错过了你没有使用从 25 到 76 的整个序列。我现在已经对其进行了编辑,以便它进行正确的计算。我最好的建议是玩弄这些碎片,看看它们是如何工作的。如果这对您有用,您可以通过单击其左侧的复选标记来接受答案。祝你好运!
  • 实际上,我的 df1[5] 和其他,每个都有 215 个观察值,当我(小心地)应用公式时,它会产生 NA。我会再试一次,让你知道。我不认为“prod”是正确使用的函数。
  • @ikel -- 你说得对,prod() 不是正确的函数,因为这些元素本身就是向量。要获得向量列表的元素乘法,您可以使用Reduce("*", list(A, B, C))。我添加了第二组可能适用于您的数据的代码(虽然我不知道,因为我没有看到它的结构)。干杯。
  • +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

【讨论】:

  • +1 表示混淆程度较低且比我的任何一个答案都更好的代码。尽管如此,当我得到它时,我似乎永远不会放弃使用Reduce()的机会...
  • @Tommy -- 感谢
猜你喜欢
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多