提问人:bvowe 提问时间:6/14/2019 最后编辑:jogobvowe 更新时间:6/14/2019 访问量:440
带 NA 的 R cummax 功能
R cummax function with NA
问:
数据
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 值,我想结转以前的值。谢谢。
答:
0赞
Ronak Shah
6/14/2019
#1
一种方法是首先填写值,然后对于每一行检查组中是否传递了 3 或更高的分数。如果直到该点达到 3 分,我们将取该点的分数,否则返回相同的分数。NA
max
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
这是使用 .您可能想在之后使用,但这有点不清楚。tidyverse
fill()
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 来表示类型稳定性:accumulate
purrr
if_else_
hablar
library(tidyverse)
library(hablar)
data %>%
fill(score) %>%
group_by(person) %>%
mutate(wt = accumulate(score, ~if_else_(.x > 2, max(.x, .y), .y)))
上一个:R 返回第一个下划线后的所有字符
下一个:dplyr:将宽整为长 [复制]
评论