【问题标题】:Trying to produce a loop for summing up consecutive column values in R试图产生一个循环来总结 R 中的连续列值
【发布时间】:2020-11-27 20:54:58
【问题描述】:

我正在尝试生成一个循环函数来总结一个表的连续列值并将它们输出到另一个表中

例如,在我的原始表中,我们有 a、b、c 等列,它们包含相同数量的数值。 生成的表应该是 a、a+b、a+b+c 等,直到原始表的最后一列

我觉得 for 循环应该足以完成此操作,但我无法理解格式和语法。

任何帮助将不胜感激!

【问题讨论】:

  • 欢迎来到堆栈。这里的想法是给出一个最小的可重复示例(minimal reproducible example),以便其他人可以使用您的示例为您提供答案。如果您能提供到目前为止您尝试过的代码,我们将不胜感激。
  • 嗨,对不起,我现在使用的代码是 CoEig1 = coEigFrame[,1] CoEig2 = coEigFrame[,1]+coEigFrame[,2] CoEig3 = coEigFrame[,1] +coEigFrame[,2]+coEigFrame[,3] dataFrame = cbind(CoEig1, CoEig2, CoEig3) coEigFrame 是一个数值数据框但是我想要的是一个 for 循环或沿着这条线的东西来代替这个函数重度强制代码

标签: r loops for-loop sum nested-loops


【解决方案1】:

由于您是新手,这里有一个非常最小的可重现示例的示例?

library(data.table)
x = data.table(a=1:3,b=4:6,c=7:9)
for(... now what?

这是一种完成任务的方法:

library(data.table)
# make some dummy data
X = data.table(a=1:2,b=3:4,c=5:6)
# make an empty result table
Y = data.table()
# for i = 1 to the number of columns in X
for(i in 1:ncol(X)){
  # colnames(X) is "a" "b" "c".
  # colnames(X)[1:1] is "a", colnames(X)[1:2] is "a" "b", colnames(X)[1:3] is "a" "b" "c"
  # paste0(colnames(X)[1:1],collapse='') is "a",
  # paste0(colnames(X)[1:2],collapse='') is "ab",
  # paste0(colnames(X)[1:3],collapse='') is "abc"
  newcolname = paste0(colnames(X)[1:i],collapse='')
  # Y[,(newcolname):= is data.table syntax to create a new column called newcolname
  # X[,1:i] selects columns 1 to i
  # rowSums calculates the, um, row sums :D
  Y[,(newcolname):=rowSums(X[,1:i])]
}

【讨论】:

  • 您好,我会在下一个查询中做得更好!出现此错误消息,“rowSums(coEigFrame[, 1:i]) 中的错误:'x' 必须是至少二维的数组” CoEigFrame 只是我使用的一个数据框,由 3 列数值组成,它没有列名,只有“1”、“2”、“3”
  • 您必须使用 data.table 才能使此代码正常工作,而不是 data.frame。要将 data.frame 转换为 data.table,请执行 setDT(myData) 将 myData 就地转换为 data.table。顺便说一句,不要这样做myData = setDT(myDate)
【解决方案2】:

也许你需要Reduce,如下所示

cbind(
  df,
  setNames(
    as.data.frame(Reduce(`+`, df, accumulate = TRUE)),
    Reduce(paste0, names(df), accumulate = TRUE)
  )
)

这样

  a b c a ab abc
1 1 4 7 1  5  12
2 2 5 8 2  7  15
3 3 6 9 3  9  18

数据

df <- structure(list(a = 1:3, b = 4:6, c = 7:9), class = "data.frame", row.names = c(NA, 
-3L))

【讨论】:

    猜你喜欢
    • 2020-12-04
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多