R 计算行中NA值的数量-0时重置
我遇到了这样一个问题:“遇到0时重置的累积总和”via,它部分但不完全回答了我的问题。我首先想创建一个列,该列按行累加b列中每个序列的值,b列由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
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
同时回答三个问题!你挑吧。:)三个同时回答!你挑吧。:)