Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.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 计算行中NA值的数量-0时重置_R_Cumsum - Fatal编程技术网

R 计算行中NA值的数量-0时重置

R 计算行中NA值的数量-0时重置,r,cumsum,R,Cumsum,我遇到了这样一个问题:“遇到0时重置的累积总和”via,它部分但不完全回答了我的问题。我首先想创建一个列,该列按行累加b列中每个序列的值,b列由0分隔。这是我通过使用代码实现的: setDT(df)[,whatiwant:=cumsum(b),by=rleid(b==0L)] 如中所述 (提供的其他解决方案对我不起作用。它们只产生NA值。) 现在,我还想在插图中创建第三列“What I Want”,它将给定序列的累积值的最大聚合值分配给该特定序列中的每个观测值。让我举例说明一下 b Ac

我遇到了这样一个问题:“遇到0时重置的累积总和”via,它部分但不完全回答了我的问题。我首先想创建一个列,该列按行累加b列中每个序列的值,b列由0分隔。这是我通过使用代码实现的:

setDT(df)[,whatiwant:=cumsum(b),by=rleid(b==0L)]

如中所述 (提供的其他解决方案对我不起作用。它们只产生NA值。) 现在,我还想在插图中创建第三列“What I Want”,它将给定序列的累积值的最大聚合值分配给该特定序列中的每个观测值。让我举例说明一下

b     Accumulated   What I Want
1      1            3
1      2            3
1      3            3
0      0            0
1      1            4
1      2            4
1      3            4
1      4            4
0      0            0
0      0            0
0      0            0
1      1            2
1      2            2

也许有一个非常简单的方法可以做到这一点。先谢谢你

您可以使用
rle
reverse.rle
如下:

b <- c(1,1,1,0,1,1,1,1,0,0,0,1,1)

x <- rle(b)
i <- x$values == 1
x$values[i] <- x$lengths[i]
inverse.rle(x)
# [1] 3 3 3 0 4 4 4 4 0 0 0 2 2

b您可以使用
rle
reverse.rle
如下:

b <- c(1,1,1,0,1,1,1,1,0,0,0,1,1)

x <- rle(b)
i <- x$values == 1
x$values[i] <- x$lengths[i]
inverse.rle(x)
# [1] 3 3 3 0 4 4 4 4 0 0 0 2 2

b您可以在尝试中使用
max
而不是
cumsum

library(data.table)
setDT(df)[, whatiwant := max(Accumulated), by = rleid(b == 0L)]
df

#    b Accumulated whatiwant
# 1: 1           1         3
# 2: 1           2         3
# 3: 1           3         3
# 4: 0           0         0
# 5: 1           1         4
# 6: 1           2         4
# 7: 1           3         4
# 8: 1           4         4
# 9: 0           0         0
#10: 0           0         0
#11: 0           0         0
#12: 1           1         2
#13: 1           2         2

您可以在尝试中使用
max
而不是
cumsum

library(data.table)
setDT(df)[, whatiwant := max(Accumulated), by = rleid(b == 0L)]
df

#    b Accumulated whatiwant
# 1: 1           1         3
# 2: 1           2         3
# 3: 1           3         3
# 4: 0           0         0
# 5: 1           1         4
# 6: 1           2         4
# 7: 1           3         4
# 8: 1           4         4
# 9: 0           0         0
#10: 0           0         0
#11: 0           0         0
#12: 1           1         2
#13: 1           2         2
您可以使用
rle()
函数获取运行长度,然后
mapply()
将其返回值转换为所需的向量:

d <- tibble(b=c(1,1,1,0,1,1,1,1,0,0,0,1,1),
            WhatIWant=unlist(mapply(rep, rle(b)$lengths, rle(b)$lengths))) %>% 
    mutate(WhatIWant=ifelse(b == 0, 0, WhatIWant))
d%
变异(WhatIWant=ifelse(b==0,0,WhatIWant))
给予

#一个tible:13x2
b你想要什么
1     1         3
2     1         3
3     1         3
4     0         0
5     1         4
6     1         4
7     1         4
8     1         4
9     0         0
10     0         0
11     0         0
12     1         2
13     1         2
您可以使用
rle()
函数获取运行长度,然后
mapply()
将其返回值转换为所需的向量:

d <- tibble(b=c(1,1,1,0,1,1,1,1,0,0,0,1,1),
            WhatIWant=unlist(mapply(rep, rle(b)$lengths, rle(b)$lengths))) %>% 
    mutate(WhatIWant=ifelse(b == 0, 0, WhatIWant))
d%
变异(WhatIWant=ifelse(b==0,0,WhatIWant))
给予

#一个tible:13x2
b你想要什么
1     1         3
2     1         3
3     1         3
4     0         0
5     1         4
6     1         4
7     1         4
8     1         4
9     0         0
10     0         0
11     0         0
12     1         2
13     1         2

同时回答三个问题!你挑吧。:)三个同时回答!你挑吧。:)