我有一個例子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
uj5u.com熱心網友回復:
我們可以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 ""
uj5u.com熱心網友回復:
另一種選擇case_when
library(tidyverse)
df |>
group_by(group) |>
mutate(flag = case_when(
col1 > 1 ~ "",
col1 == 1 ~ "Y",
col1 == max(col1[col1 <= 1]) ~ "Y",
TRUE ~ ""
))
#> # A tibble: 17 x 3
#> # Groups: group [5]
#> 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 ""
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/529071.html
標籤:rdplyr蒂迪尔
上一篇:基于條件aR的列總和
下一篇:在R中展平具有相同識別符號的行
