R 基于单独的列计算列中的间隔总和
我有一个数据帧R 基于单独的列计算列中的间隔总和,r,dataframe,vectorization,R,Dataframe,Vectorization,我有一个数据帧df,看起来像这样: X1 X2 1 0 0.06174568 2 0 0.06174568 3 0 0.05978832 4 0 0.05978832 5 0 0.06007480 ... 22 0 0.06082051 23 0 0.06051641 24 128 0.06329613 25 0 0.06099445 26 0 0.06195348 27 0 0.060
df
,看起来像这样:
X1 X2
1 0 0.06174568
2 0 0.06174568
3 0 0.05978832
4 0 0.05978832
5 0 0.06007480
...
22 0 0.06082051
23 0 0.06051641
24 128 0.06329613
25 0 0.06099445
26 0 0.06195348
27 0 0.06022723
28 0 0.06041903
29 0 0.06195348
...
36 0 0.06195348
37 0 0.06176168
38 0 0.06233710
39 103 0.06195348
40 0 0.06195348
41 0 0.06387155
42 0 0.06291252
我想把X2
的值加起来,直到X1!=0,即第1-24行和第25-39行。应在不同的列中添加总和X3
:
X1 X2 X3
1 0 0.06174568 0.0000000
2 0 0.06174568 0.0000000
3 0 0.05978832 0.0000000
4 0 0.05978832 0.0000000
5 0 0.06007480 0.0000000
...
22 0 0.06082051 0.0000000
23 0 0.06051641 0.0000000
24 128 0.06329613 1.4660679
25 0 0.06099445 0.0000000
26 0 0.06195348 0.0000000
27 0 0.06022723 0.0000000
28 0 0.06041903 0.0000000
29 0 0.06195348 0.0000000
...
36 0 0.06195348 0.0000000
37 0 0.06176168 0.0000000
38 0 0.06233710 0.0000000
39 103 0.06195348 0.9876114
40 0 0.06195348 0.0000000
41 0 0.06387155 0.0000000
使用for循环很容易解决:
j <- 1
df$X3 <- numeric(NROW(df))
for (i in 1:NROW(df)) {
if (df$X1[i] != 0) {
df$X3[i] <- sum(df$X2[j:i])
j <- i
}
}
我们使用cumsum
创建一个组,然后执行sum
library(dplyr)
df1 %>%
group_by(grp = lag(cumsum(X1 !=0), default = 0)) %>%
mutate(X3 = replace(rep(sum(X2),n()), X1==0, 0))
使用base R,您可以组合ave
和pmin
来获得结果
dat$x3 <- pmin(dat$X1, ave(dat$X2, cumsum(c(0, diff(dat$X1) < 0)), FUN=function(x) sum(x)))
很好的一个,不知道你可以在组中定义grp。另外,祝贺300K:)谢谢,这正是我想要的!
dat$x3 <- pmin(dat$X1, ave(dat$X2, cumsum(c(0, diff(dat$X1) < 0)), FUN=function(x) sum(x)))
dat$x3 <- ave(dat$X2, cumsum(c(0, diff(dat$X1) < 0)), FUN=function(x) sum(x)) * sign(dat$X1)