带 NA 的 R cummax 功能

R cummax function with NA

提问人:bvowe 提问时间:6/14/2019 最后编辑:jogobvowe 更新时间:6/14/2019 访问量:440

问:

数据

data=data.frame("person"=c(1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2),
                 "score"=c(1,2,1,2,3,1,3,NA,4,2,1,NA,2,NA,3,1,2,4),
                  "want"=c(1,2,1,2,3,3,3,3,4,2,1,1,2,2,3,3,3,4))

尝试

library(dplyr)

data = data %>%
  group_by(person) %>%
  mutate(wantTEST = ifelse(score >= 3 | (row_number() >= which.max(score == 3)), 
                        cummax(score), score), 
         wantTEST = replace(wantTEST, duplicated(wantTEST == 4) & wantTEST == 4, NA))

我基本上正在努力使用 cummax 功能,但仅限于特定情况。我想保留任何值 (1-2-1-1),除非有 3 或 4 (1-2-1-3-2-1-4) 应该是 (1-2-1-3-3-4)。如果有 NA 值,我想结转以前的值。谢谢。

R 函数 DPLYR MAX

评论


答:

0赞 Ronak Shah 6/14/2019 #1

一种方法是首先填写值,然后对于每一行检查组中是否传递了 3 或更高的分数。如果直到该点达到 3 分,我们将取该点的分数,否则返回相同的分数。NAmax

library(tidyverse)

data %>%
  fill(score) %>%
   group_by(person) %>%
   mutate(want1 = map_dbl(seq_len(n()), ~if(. >= which.max(score == 3))
                                    max(score[seq_len(.)]) else score[.]))

#   person score  want want1
#    <dbl> <dbl> <dbl> <dbl>
# 1      1     1     1     1
# 2      1     2     2     2
# 3      1     1     1     1
# 4      1     2     2     2
# 5      1     3     3     3
# 6      1     1     3     3
# 7      1     3     3     3
# 8      1     3     3     3
# 9      1     4     4     4
#10      2     2     2     2
#11      2     1     1     1
#12      2     1     1     1
#13      2     2     2     2
#14      2     2     2     2
#15      2     3     3     3
#16      2     1     3     3
#17      2     2     3     3
#18      2     4     4     4
4赞 Shree 6/14/2019 #2

这是使用 .您可能想在之后使用,但这有点不清楚。tidyversefill()group_by()

data %>% 
  fill(score) %>% 
  group_by(person) %>% 
  mutate(
    w = ifelse(cummax(score) > 2, cummax(score), score)
  ) %>%
  ungroup()

# A tibble: 18 x 4
   person score  want     w
    <dbl> <dbl> <dbl> <dbl>
 1      1     1     1     1
 2      1     2     2     2
 3      1     1     1     1
 4      1     2     2     2
 5      1     3     3     3
 6      1     1     3     3
 7      1     3     3     3
 8      1     3     3     3
 9      1     4     4     4
10      2     2     2     2
11      2     1     1     1
12      2     1     1     1
13      2     2     2     2
14      2     2     2     2
15      2     3     3     3
16      2     1     3     3
17      2     2     3     3
18      2     4     4     4
0赞 davsjob 6/14/2019 #3

另一种方法是使用 from .我使用 from 来表示类型稳定性:accumulatepurrrif_else_hablar

library(tidyverse)
library(hablar)

data %>% 
  fill(score) %>% 
  group_by(person) %>% 
  mutate(wt = accumulate(score, ~if_else_(.x > 2, max(.x, .y), .y)))