R 连续相同值之和
我想知道每个事件的斜率之和,其中1,如果可用,则连续发生1。所以我得到如下输出:R 连续相同值之和,r,R,我想知道每个事件的斜率之和,其中1,如果可用,则连续发生1。所以我得到如下输出: slope term 0.5 1 0.8 1 0.3 0 0.25 0 0.18 0 0.4 0 1.2 1 3.6 1 0.67 1 0.3 0 0.8 1 0.4 0 这并不完全是您想要的,但您可以使用数据。tab
slope term
0.5 1
0.8 1
0.3 0
0.25 0
0.18 0
0.4 0
1.2 1
3.6 1
0.67 1
0.3 0
0.8 1
0.4 0
这并不完全是您想要的,但您可以使用数据。table::rleid
对数据进行分组-rleid
是数据。表格版本的rle
资料
df这不完全是您想要的,但您可以使用数据。table::rleid
对数据进行分组-rleid
是数据。table版本的rle
资料
df这里有一个使用base R
的选项。使用rle
('grp')创建一个分组变量,然后使用ave
,按'grp'分组,在将与'term'0相对应的值转换为NA
后,获得'slope'的和
library(data.table)
dt <- setDT(df)
dt[, sum:=sum(slope)*max(term), by=rleid(term)]
dt
# slope term sum
# 1: 0.50 1 1.30
# 2: 0.80 1 1.30
# 3: 0.30 0 0.00
# 4: 0.25 0 0.00
# 5: 0.18 0 0.00
# 6: 0.40 0 0.00
# 7: 1.20 1 5.47
# 8: 3.60 1 5.47
# 9: 0.67 1 5.47
# 10: 0.30 0 0.00
# 11: 0.80 1 0.80
grp这里有一个使用base R
的选项。使用rle
('grp')创建一个分组变量,然后使用ave
,按'grp'分组,在将与'term'0相对应的值转换为NA
后,获得'slope'的和
library(data.table)
dt <- setDT(df)
dt[, sum:=sum(slope)*max(term), by=rleid(term)]
dt
# slope term sum
# 1: 0.50 1 1.30
# 2: 0.80 1 1.30
# 3: 0.30 0 0.00
# 4: 0.25 0 0.00
# 5: 0.18 0 0.00
# 6: 0.40 0 0.00
# 7: 1.20 1 5.47
# 8: 3.60 1 5.47
# 9: 0.67 1 5.47
# 10: 0.30 0 0.00
# 11: 0.80 1 0.80
grp1)这使用data.table
中的rleid
创建分组变量和剩余的基数Rave
计算每个组和ifelse
0组的总和
grp <- inverse.rle(within.list(rle(df1$term), values <- seq_along(values)))
df1$sum_slope <- with(df1, ave(slope * (NA^!term), grp, FUN = sum))
df1$sum_slope
#[1] 1.30 1.30 NA NA NA NA 5.47 5.47 5.47 NA 0.80 NA
给予:
library(data.table)
transform(DF, sum_slope = ave(slope, rleid(term), FUN = sum) * ifelse(term, 1, NA))
2)上述变体仅使用基数R。它将rleid
替换为一个基数表达式,cumsum(…)
,该表达式具有相同的功能
slope term sum_slope
1 0.50 1 1.30
2 0.80 1 1.30
3 0.30 0 NA
4 0.25 0 NA
5 0.18 0 NA
6 0.40 0 NA
7 1.20 1 5.47
8 3.60 1 5.47
9 0.67 1 5.47
10 0.30 0 NA
11 0.80 1 0.80
12 0.40 0 NA
注
可复制形式的输入:
transform(DF, sum_slope =
ave(slope, cumsum(c(FALSE, diff(term) != 0)), FUN = sum) * ifelse(term, 1, NA))
行1)这使用data.table
中的rleid
创建分组变量和剩余的基数Rave
计算每个组和ifelse
0组的总和
grp <- inverse.rle(within.list(rle(df1$term), values <- seq_along(values)))
df1$sum_slope <- with(df1, ave(slope * (NA^!term), grp, FUN = sum))
df1$sum_slope
#[1] 1.30 1.30 NA NA NA NA 5.47 5.47 5.47 NA 0.80 NA
给予:
library(data.table)
transform(DF, sum_slope = ave(slope, rleid(term), FUN = sum) * ifelse(term, 1, NA))
2)上述变体仅使用基数R。它将rleid
替换为一个基数表达式,cumsum(…)
,该表达式具有相同的功能
slope term sum_slope
1 0.50 1 1.30
2 0.80 1 1.30
3 0.30 0 NA
4 0.25 0 NA
5 0.18 0 NA
6 0.40 0 NA
7 1.20 1 5.47
8 3.60 1 5.47
9 0.67 1 5.47
10 0.30 0 NA
11 0.80 1 0.80
12 0.40 0 NA
注
可复制形式的输入:
transform(DF, sum_slope =
ave(slope, cumsum(c(FALSE, diff(term) != 0)), FUN = sum) * ifelse(term, 1, NA))
行请使用dput
制作可复制的示例。请使用dput
制作可复制的示例。