Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 连续相同值之和_R - Fatal编程技术网

R 连续相同值之和

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

我想知道每个事件的斜率之和,其中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
这并不完全是您想要的,但您可以使用
数据。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
创建分组变量和剩余的基数R
ave
计算每个组和
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
创建分组变量和剩余的基数R
ave
计算每个组和
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
制作可复制的示例。