gpt4 book ai didi

r - 在由某些值进一步子集的组中查找记录并改变标志

转载 作者:行者123 更新时间:2023-12-05 01:03:23 25 4
gpt4 key购买 nike

我有一个例子 df:

df <- data.frame(
group = c("a", "a", "a", "a", "b", "b", "c", "c", "c", "c", "d", "d", "d", "e", "e", "e", "e"),
col1 = c(-36,10,-5,1, 0, 5,10, 5, 20, 2, -1, 1, 2, -10, -5, -1, 10 )

)

group col1
1 a -36
2 a 10
3 a -5
4 a 1
5 b 0
6 b 5
7 c 10
8 c 5
9 c 20
10 c 2
11 d -1
12 d 1
13 d 2
14 e -10
15 e -5
16 e -1
17 e 10

我想改变一个标志,这样如果按'group分组,如果col1中有值1,则将其设置为“Y”,并将该组中的所有其他记录设置为空白。如果值小于或等于 1,则将 col1 最高的记录设置为“Y”,并将该组中的所有其他记录设置为空白(但 col1 不能大于 1 - 这些记录必须具有空白标志)。否则,将每条记录设置为空白。每条大于 1 的记录都应该有空白标志。

这是我尝试过的:

df3 <- df %>% mutate(flag = case_when(
any(col1 == 1) ~ ifelse(col1 == 1, "Y", ""),
any(col1 < 1) & !any(col1 == 1) ~ ifelse(col1 < 1 & col1 == max(col1), "Y", ""),
TRUE ~ ""))

这是预期的结果:

   group col1 flag
1 a -36
2 a 10
3 a -5
4 a 1 Y
5 b 0 Y
6 b 5
7 c 10
8 c 5
9 c 20
10 c 2
11 d -1
12 d 1 Y
13 d 2
14 e -10
15 e -5
16 e -1 Y
17 e 10

最佳答案

我们可以在按'group'分组后使用if/else条件

library(dplyr)
df %>%
group_by(group) %>%
mutate(flag = c("", "Y")[1+ (if(1 %in% col1) col1 == 1 else
if(any(col1 < 1)) col1 == max(col1[col1 <= 1]) else FALSE)]) %>%
# compact version with a warning
# mutate(flag = c("", "Y")[1+(col1 == max(col1[col1 <=1], na.rm = TRUE))]) %>%
ungroup

-输出

# A tibble: 17 × 3
group col1 flag
<chr> <dbl> <chr>
1 a -36 ""
2 a 10 ""
3 a -5 ""
4 a 1 "Y"
5 b 0 "Y"
6 b 5 ""
7 c 10 ""
8 c 5 ""
9 c 20 ""
10 c 2 ""
11 d -1 ""
12 d 1 "Y"
13 d 2 ""
14 e -10 ""
15 e -5 ""
16 e -1 "Y"
17 e 10 ""

关于r - 在由某些值进一步子集的组中查找记录并改变标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74351127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com