我有 df
df = data.frame(
group = c(rep("A", 3), rep("B", 3)),
vt = c("SO:0001574", "SO:0001619", "SO:0001619", "SO:0001619", "SO:0001619", "SO:0001821")
)
Run Code Online (Sandbox Code Playgroud)
和两个向量:
tier_1 = c("SO:0001574", "SO:0001575")
tier_2 = c("SO:0001821", "SO:0001822")
Run Code Online (Sandbox Code Playgroud)
我想产生一个输出:
group vt ct
1 A SO:0001574 tier_1
2 A SO:0001619 tier_1
3 A SO:0001619 tier_1
4 B SO:0001619 tier_2
5 B SO:0001619 tier_2
6 B SO:0001821 tier_2
Run Code Online (Sandbox Code Playgroud)
即我想生成第三列 ct,它根据 tier_1 或 tier_2 中 vt 列的存在进行填充,以便给定组中的所有行都填充该层类型。
我试过了:
df %>%
dplyr::group_by(group) %>%
dplyr::mutate(tier = dplyr::case_when(
vt %in% tier_1 ~ "tier_1",
vt %in% tier_2 ~ "tier_2"))
Run Code Online (Sandbox Code Playgroud)
但这只会填充单个行,而不是组中的所有行:
# A tibble: 6 x 4
# Groups: group [2]
group vt ct tier
<chr> <chr> <chr> <chr>
1 A SO:0001574 tier_1 tier_1
2 A SO:0001619 tier_1 NA
3 A SO:0001619 tier_1 NA
4 B SO:0001619 tier_2 NA
5 B SO:0001619 tier_2 NA
6 B SO:0001821 tier_2 tier_2
Run Code Online (Sandbox Code Playgroud)
包装代码any以获得每组一个逻辑值:
library(dplyr)
df %>%
group_by(group) %>%
mutate(tier = case_when(
any(vt %in% tier_1) ~ "tier_1",
any(vt %in% tier_2) ~ "tier_2"))
# group vt tier
# <chr> <chr> <chr>
#1 A SO:0001574 tier_1
#2 A SO:0001619 tier_1
#3 A SO:0001619 tier_1
#4 B SO:0001619 tier_2
#5 B SO:0001619 tier_2
#6 B SO:0001821 tier_2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
144 次 |
| 最近记录: |