通过使用 R 中的 lag() 添加到上面的行来填充列
Populate column by adding onto row above using lag() in R
我想用不断添加到上面一行的值填充现有列。
这在 Excel 中很容易,但我还没有找到在 R 中自动化它的好方法。
如果我们在 Excel 中有 2 列,A 和 B,我们希望单元格 B2 = B1+A2,而单元格 B3 = B2+A3。我如何在 R 中执行此操作?
#example dataframe
df <- data.frame(A = 0:9, B = c(50,0,0,0,0,0,0,0,0,0))
#desired output
desired <- data.frame(A = 0:9, B = c("NA",51,53,56,60,65,71,78,86,95))
我尝试使用 lag() 函数,但它没有给出正确的输出。
df <- df %>%
mutate(B = B + lag(A))
所以我做了一个可行的 for 循环,但我觉得有更好的解决方案。
for(i in 2:nrow(df)){
df$B[i] <- df$B[i-1] + df$A[i]
}
最后,我想在整个数据帧的每 n 行上迭代这个函数,基本上这样求和每 n 行重置一次。 (任何关于如何做到这一点的提示将不胜感激!)
cumsum()
可以得到你需要的结果。
df$B <- cumsum(df$B + df$A)
df
A B
1 0 50
2 1 51
3 2 53
4 3 56
5 4 60
6 5 65
7 6 71
8 7 78
9 8 86
10 9 95
这可能接近您的需要,并使用 tidyverse
。具体来说,它使用 purrr
中的 accumulate
。
假设你想每隔 n
行重置为零,你也可以提前使用 group_by
。
不完全清楚您想如何处理第一行;在这里,它将只使用第一个 B
值并忽略第一个 A
值,它看起来与 post.
中的值相似
n <- 5
library(tidyverse)
df %>%
group_by(grp = ceiling(row_number() / n)) %>%
mutate(B = accumulate(A[-1], sum, .init = B[1]))
输出
A B grp
<int> <dbl> <dbl>
1 0 50 1
2 1 51 1
3 2 53 1
4 3 56 1
5 4 60 1
6 5 0 2
7 6 6 2
8 7 13 2
9 8 21 2
10 9 30 2
我想用不断添加到上面一行的值填充现有列。 这在 Excel 中很容易,但我还没有找到在 R 中自动化它的好方法。
如果我们在 Excel 中有 2 列,A 和 B,我们希望单元格 B2 = B1+A2,而单元格 B3 = B2+A3。我如何在 R 中执行此操作?
#example dataframe
df <- data.frame(A = 0:9, B = c(50,0,0,0,0,0,0,0,0,0))
#desired output
desired <- data.frame(A = 0:9, B = c("NA",51,53,56,60,65,71,78,86,95))
我尝试使用 lag() 函数,但它没有给出正确的输出。
df <- df %>%
mutate(B = B + lag(A))
所以我做了一个可行的 for 循环,但我觉得有更好的解决方案。
for(i in 2:nrow(df)){
df$B[i] <- df$B[i-1] + df$A[i]
}
最后,我想在整个数据帧的每 n 行上迭代这个函数,基本上这样求和每 n 行重置一次。 (任何关于如何做到这一点的提示将不胜感激!)
cumsum()
可以得到你需要的结果。
df$B <- cumsum(df$B + df$A)
df
A B
1 0 50
2 1 51
3 2 53
4 3 56
5 4 60
6 5 65
7 6 71
8 7 78
9 8 86
10 9 95
这可能接近您的需要,并使用 tidyverse
。具体来说,它使用 purrr
中的 accumulate
。
假设你想每隔 n
行重置为零,你也可以提前使用 group_by
。
不完全清楚您想如何处理第一行;在这里,它将只使用第一个 B
值并忽略第一个 A
值,它看起来与 post.
n <- 5
library(tidyverse)
df %>%
group_by(grp = ceiling(row_number() / n)) %>%
mutate(B = accumulate(A[-1], sum, .init = B[1]))
输出
A B grp
<int> <dbl> <dbl>
1 0 50 1
2 1 51 1
3 2 53 1
4 3 56 1
5 4 60 1
6 5 0 2
7 6 6 2
8 7 13 2
9 8 21 2
10 9 30 2