我有一个看起来像这样的数据集
data <- data.frame(ID = c("1a", "1b", "2a", "2b", "3a", "4b", "5a", "5b"),
Sex = c(1, 2, 2, 1, 1, 2, 1, 2))
Run Code Online (Sandbox Code Playgroud)
ID Sex
1a 1
1b 2
2a 2
2b 1
3a 1
4b 2
5a 1
5b 2
Run Code Online (Sandbox Code Playgroud)
我想根据 进行过滤ID。具体来说,如果 中的字符串中有相同的数字ID,例如 1a 和 1b、2a 和 2b、5a 和 5b,那么我想过滤Sex= 1 的行。此外,我想保留 3a 和 4b 的行,因为无论 中的值如何,它都没有 3b 和 4a 的对应项Sex。
我最终想要的输出是:
ID Sex
1a 1
2b 1
3a 1
4b 2
5a 1
Run Code Online (Sandbox Code Playgroud)
感谢您的帮助!
我们可以按'ID'的数字部分进行分组,当行数为1时,filter其中Sex1 或 ( )|
library(dplyr)\ndata %>% \n group_by(grp = readr::parse_number(ID)) %>%\n filter(Sex == 1|n() ==1) %>%\n ungroup %>% \n select(-grp)\nRun Code Online (Sandbox Code Playgroud)\n-输出
\n# A tibble: 5 \xc3\x97 2\n ID Sex\n <chr> <dbl>\n1 1a 1\n2 2b 1\n3 3a 1\n4 4b 2\n5 5a 1\nRun Code Online (Sandbox Code Playgroud)\n
主意:
\nlibrary(dplyr)\nlibrary(tidyr)\n\ndata <- data.frame(ID = c("1a", "1b", "2a", "2b", "3a", "4b", "5a", "5b"),\n Sex = c(1, 2, 2, 1, 1, 2, 1, 2))\n\ndata %>% \n separate(ID, into = c("ID_1", "ID_2"), sep = 1) %>% \n group_by(ID_1) %>% \n filter(n() <= 1 | (all(c("a", "b") %in% ID_2) & Sex == 1)) %>% \n ungroup() %>% \n unite(col = "ID", ID_1, ID_2, sep = "")\n#> # A tibble: 5 \xc3\x97 2\n#> ID Sex\n#> <chr> <dbl>\n#> 1 1a 1\n#> 2 2b 1\n#> 3 3a 1\n#> 4 4b 2\n#> 5 5a 1\nRun Code Online (Sandbox Code Playgroud)\n由reprex 包于 2022 年 7 月 11 日创建(v2.0.1)
\n