首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rle忽略NA's的累加is.na

rle忽略NA's的累加is.na
EN

Stack Overflow用户
提问于 2019-10-15 15:09:59
回答 2查看 236关注 0票数 3

简单的问题。假设我有以下数据:

代码语言:javascript
复制
library(tidyverse)
df <- data.frame(group = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2),
                     variable = c(NA, "a", NA, "b", "c", NA, NA, NA, NA, "a", NA, "c", NA, NA, "d", NA, NA, "a"))
df
   group variable
1      1     <NA>
2      1        a
3      1     <NA>
4      1        b
5      1        c
6      1     <NA>
7      1     <NA>
8      1     <NA>
9      1     <NA>
10     1        a
11     1     <NA>
12     1        c
13     1     <NA>
14     1     <NA>
15     1        d
16     2     <NA>
17     2     <NA>
18     2        a

我只想使用cumsum(is.na(variable)来计数丢失的变量,但是忽略连续丢失的变量,所以我想要的输出如下:

代码语言:javascript
复制
   group variable newvariable
1      1     <NA>           1
2      1        a           1
3      1     <NA>           2
4      1        b           2
5      1        c           2
6      1     <NA>           3
7      1     <NA>           3
8      1     <NA>           3
9      1     <NA>           3
10     1        a           3
11     1     <NA>           4
12     1        c           4
13     1     <NA>           5
14     1     <NA>           5
15     1        d           5
16     2     <NA>           1
17     2     <NA>           1
18     2        a           1

我认为我需要将rle合并到我的代码中:

代码语言:javascript
复制
df %>%
  group_by(group, na_group = {na_group = rle(variable); rep(seq_along(na_group$lengths), na_group$lengths)}) %>%
  mutate(newvariable = cumsum((is.na(variable)))) #?

也许map在小组上能起作用。有什么建议吗?

参考文献:Identify sets of NA in a vector Count consecutive values in groups with condition with dplyr and rle

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-15 15:28:54

代码语言:javascript
复制
df %>%
    group_by(group) %>%
    mutate(new = with(rle(is.na(variable)), rep(cumsum(values), lengths))) %>%
    ungroup()
票数 3
EN

Stack Overflow用户

发布于 2019-10-15 17:17:55

另一种选择是在逻辑向量上使用diffcumsum

代码语言:javascript
复制
library(data.table)
setDT(df)[, new := cumsum(c(TRUE, diff(is.na(variable)) > 0) ), group ]

或使用dplyr

代码语言:javascript
复制
library(dplyr)
df %>%
   group_by(group) %>%
   mutate(new = cumsum(c(TRUE, diff(is.na(variable)) > 0)))
# A tibble: 18 x 3
# Groups:   group [2]
#   group variable   new
#   <dbl> <fct>    <int>
# 1     1 <NA>         1
# 2     1 a            1
# 3     1 <NA>         2
# 4     1 b            2
# 5     1 c            2
# 6     1 <NA>         3
# 7     1 <NA>         3
# 8     1 <NA>         3
# 9     1 <NA>         3
#10     1 a            3
#11     1 <NA>         4
#12     1 c            4
#13     1 <NA>         5
#14     1 <NA>         5
#15     1 d            5
#16     2 <NA>         1
#17     2 <NA>         1
#18     2 a            1
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58397806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档