如何按subject组将data frame中的重复day值替换为NA?
问题:分组替换重复值为NA
我有如下数据框:
subject <- c(1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5) day <- c(20, 20, 20 , 20, 20, 40 , 40 , 40 , 40 , 50, 50, 50, 40, 40, 40, 40, 20, 20) ex <- data.frame(subject, day)
需要实现:在每个subject分组内,仅保留第一个day值,其余重复的day替换为NA,最终得到如下结果:
subject day 1 1 20 2 1 NA 3 1 NA 4 1 NA 5 1 NA 6 2 40 7 2 NA 8 2 NA 9 2 NA 10 3 50 11 3 NA 12 3 NA 13 4 40 14 4 NA 15 4 NA 16 4 NA 17 5 20 18 5 NA
解决方案
方法1:使用dplyr(tidyverse)包
先确保安装并加载dplyr包,再按分组逻辑处理:
library(dplyr) ex_processed <- ex %>% group_by(subject) %>% mutate(day = ifelse(row_number() == 1, day, NA)) %>% ungroup()
逻辑说明:按subject分组后,通过row_number()判断是否为组内第一行,是则保留原day值,否则替换为NA,最后取消分组状态。
方法2:使用基础R(无需额外包)
借助ave()函数实现分组替换:
ex_processed <- ex ex_processed$day <- ave(ex_processed$day, ex_processed$subject, FUN = function(x) replace(x, -1, NA))
逻辑说明:ave()按subject对day列分组处理,自定义函数将每组除第一个元素外的所有值替换为NA。
内容的提问来源于stack exchange,提问作者samthecodegod
相关产品推荐
相关产品推荐

