R 中数据帧的 For 循环

Ser*_*lla 6 r dataframe

我正在尝试用R中的for循环执行累加功能,因为公司提供的财务信息是针对不同概念累积的(这意味着一月的信息只是一月的信息,二月的信息是一月的总和)二月、三月是一月、二月、三月之和等)。

例如,假设我有下一个数据框:

Concepts <- c("Concept1", "Concept2", "Concept3")
January <- c(5,10,16)
February <- c(9,14,20)
March <- c(16,20,23)

df <- data.frame(Concepts, January, February, March)
Run Code Online (Sandbox Code Playgroud)

这将为我提供下一个数据框:

Concepts  January  February  March
Concept1    5         9        16 
Concept2    10        14       20
Concept3    16        20       23 
Run Code Online (Sandbox Code Playgroud)

我需要实现的是下一个数据框(请注意,二月是二月和一月之间的差异,三月是二月和三月之间的差异):

Concepts  January  February  March
Concept1    5         4        7 
Concept2    10        4        6
Concept3    16        4        3
Run Code Online (Sandbox Code Playgroud)

为了实现第二个数据帧,我首先创建了一个具有相同数量的 df 行的空数据帧,然后使用 for 循环 cbind 数据帧的前两行(因为它们不需要任何操作)并使用索引添加下一个计算差异后的。上面的代码如下:

df <- data.frame(Concepts, January, February, March)
df2 <- data.frame(matrix(nrow=nrow(df),ncol=ncol(df))) #Empty Dataframe with the same number  of rows

for(i in 1:ncol(df)) {
  if(i == 1){
    df2 <- cbind(df2, df[ , i])
  } else if (i == 2){
    df2 <- cbind(df2, df[, i])
  } else {
    diference <- df[,i] - df[,i-1]
    df2 <- cbind(df2,diference)
  }
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

(df, , i)中的错误[.data.table:j([...] 内的第二个参数)是单个符号,但未找到列名“i”。也许您想要 DT[, ..i]。与 data.frame 的这种差异是故意的,并在 FAQ 1.1 中进行了解释。

我希望收到对我的代码的更正或一些替代方案,使我能够计算多年数据帧的上述内容。

Ser*_*lla 1

我的问题的解决方案比我预期的更简单:

for(i in 1:ncol(df)) {
  if(i == 1){
   df2 <- cbind(df2, df[ ,..i])
} else if (i == 2){
   df2 <- cbind(df2, df[,..i])
} else {
   diference <- df[,i] - df[,..i-1]
   df2 <- cbind(df2,diference)
}
Run Code Online (Sandbox Code Playgroud)

感谢所有替代解决方案!