根据另一列的值过滤一列

Dre*_*ew 5 r dplyr

我有一个看起来像这样的数据集

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)

感谢您的帮助!

akr*_*run 6

我们可以按'ID'的数字部分进行分组,当行数为1时,filter其中Sex1 或 ( )|

\n
library(dplyr)\ndata %>% \n   group_by(grp = readr::parse_number(ID)) %>%\n   filter(Sex == 1|n() ==1) %>%\n   ungroup %>% \n   select(-grp)\n
Run 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\n
Run Code Online (Sandbox Code Playgroud)\n


bre*_*auv 5

主意:

\n
    \n
  • 将ID拆分为数字和字母,检查每个ID第一个数字是否有多个字母
  • \n
  • 按数字分组
  • \n
  • 当最多有一个字母,或者 ID_2 同时包含“a”和“b”并且 Sex == 1 时保留
  • \n
\n
library(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\n
Run Code Online (Sandbox Code Playgroud)\n

由reprex 包于 2022 年 7 月 11 日创建(v2.0.1)

\n