在R中通过条件为同一组所有成员分配逻辑值
正确实现方法
你的问题出在仅判断当前行的role是否为Partner,而非检查整个家庭组内是否存在该角色。要实现需求,需在分组后对整个组进行统一判断,而非单一行。
方法1:dplyr分组后配合any()实现
library(dplyr) families <- data.frame(family=c('1', '1', '1', '2', '2', '3', '3'), name=c('John', 'Anitta', 'Steven', 'Stella', 'Robert', 'Adam', 'William'), role=c('Leader', 'Partner', 'Son', 'Leader', 'Son', 'Leader', 'Partner')) families <- families %>% group_by(family) %>% mutate(couple = any(role == 'Partner')) %>% ungroup() # 可选操作:取消分组,让数据框回到普通状态 print(families)
运行结果:
# A tibble: 7 × 4 family name role couple <chr> <chr> <chr> <lgl> 1 1 John Leader TRUE 2 1 Anitta Partner TRUE 3 1 Steven Son TRUE 4 2 Stella Leader FALSE 5 2 Robert Son FALSE 6 3 Adam Leader TRUE 7 3 William Partner TRUE
方法2:保留case_when()语法的实现
如果偏好使用case_when(),只需将组级判断逻辑作为条件传入:
families <- families %>% group_by(family) %>% mutate( couple = case_when( any(role == 'Partner') ~ TRUE, TRUE ~ FALSE ) ) %>% ungroup()
核心逻辑说明
group_by(family):按家庭分组,后续操作基于每个独立家庭组执行any(role == 'Partner'):检查当前组内是否存在至少一个role为Partner的成员,返回单个逻辑值(TRUE/FALSE)mutate():将组级的逻辑值赋值给组内每一行,实现同一家庭所有成员共享同一个couple值
内容的提问来源于stack exchange,提问作者Tito
相关产品推荐
相关产品推荐

