如何使用dplyr按组将数据框中指定最后N个观测值替换为NA?
用dplyr按组替换指定位置的value为NA
嘿,我来帮你搞定这个用dplyr按组替换数据框指定值为NA的问题!针对你给出的两种需求,我会分别给出具体的实现代码和逻辑解释。
首先先确认我们的原始数据:
library(dplyr) have <- data.frame(id = c(1,1,1,1,2,2,2), value = c(1,2,3,4,5,6,7))
实现want1:每组最后1个观测值替换为NA
核心思路是按id分组后,标记每组的最后一行,将其value替换为NA。我们可以用row_number()获取组内行的序号,n()获取每组的总行数,通过判断序号是否等于总行数来定位最后一行:
want1 <- have %>% group_by(id) %>% mutate(value = ifelse(row_number() == n(), NA, value)) %>% ungroup() # 输出结果 want1 #> id value #> 1 1 1 #> 2 1 2 #> 3 1 3 #> 4 1 NA #> 5 2 5 #> 6 2 6 #> 7 2 NA
解释:
group_by(id):按id字段分组,后续操作都在组内执行row_number() == n():判断当前行是否是组内的最后一行(row_number()生成组内行号,n()返回组内总行数)mutate():修改value列,满足条件的行设为NA,否则保留原值ungroup():取消分组,恢复为普通数据框
实现want2:每组最后1个和倒数第2个观测值替换为NA
逻辑和want1类似,只是需要同时匹配倒数第二行和最后一行,我们可以判断行号是否大于等于n()-1(n()-1是倒数第二行的序号):
want2 <- have %>% group_by(id) %>% mutate(value = ifelse(row_number() >= n() - 1, NA, value)) %>% ungroup() # 输出结果 want2 #> id value #> 1 1 1 #> 2 1 2 #> 3 1 NA #> 4 1 NA #> 5 2 5 #> 6 2 NA #> 7 2 NA
解释:
row_number() >= n() - 1:匹配组内倒数第二行(序号为n()-1)和最后一行(序号为n())- 其余步骤和want1一致,完成替换后取消分组
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

