我正在尝试用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 中进行了解释。
我希望收到对我的代码的更正或一些替代方案,使我能够计算多年数据帧的上述内容。
我的问题的解决方案比我预期的更简单:
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)
感谢所有替代解决方案!
| 归档时间: |
|
| 查看次数: |
5327 次 |
| 最近记录: |