如何按组提取指定值填充新列?缺失时用NA填充
R语言按分组提取指定值并填充整组的实现方法
需求说明
按type字段分组,从每组中提取grp为'a'对应的val值,将该值填充到新列的整组行中;若某组不存在grp为'a'的记录,则新列对应组的所有行填充NA。
示例数据
dd1 <- data.frame(type = c(1,1,1), grp = c('a', 'b', 'd'), val = c(1,2,3)) dd2 <- data.frame(type = c(2,2), grp = c('a', 'b'), val = c(8,2)) dd3 <- data.frame(type = c(3,3), grp = c('b', 'd'), val = c(7,4)) dd <- rbind(dd1, dd2, dd3)
尝试代码
dd %>% group_by(type) %>% mutate(#val_a = ifelse(grp == 'a', val , NA), val_a2 = val[grp == 'a'])
解决方案
利用dplyr的分组功能,直接提取每组中grp为'a'的val值,再通过向量广播填充整组。如果组内没有grp为'a'的记录,提取结果会自动返回NA:
library(dplyr) dd %>% group_by(type) %>% mutate(val_a = val[grp == 'a'][1]) %>% ungroup()
代码说明
group_by(type):按type字段分组val[grp == 'a']:筛选当前组内grp为'a'的val值,无匹配时返回空向量[1]:取筛选结果的第一个值(若为空向量则返回NA),分组环境下这个值会自动填充到当前组的所有行中ungroup():取消分组,回到普通数据框结构
期望输出
# A tibble: 7 × 4 type grp val val_a <dbl> <chr> <dbl> <dbl> 1 1 a 1 1 2 1 b 2 1 3 1 d 3 1 4 2 a 8 8 5 2 b 2 8 6 3 b 7 NA 7 3 d 4 NA
内容的提问来源于stack exchange,提问作者maycca
相关产品推荐
相关产品推荐

