如何仅当Z列最后非NA值不含VALUE1时,在数据框末尾添加指定行
需求与问题
我有一个包含多个数据框的列表,需要实现:当某个数据框的Z列最后一个非NA值不包含VALUE1时,在该数据框的末尾添加一行——该行的Z列值为VALUE1,col1到col3列的值为0。
我已有一段脚本,能在Z列首个值不含VALUE1时在数据框开头添加指定行,但无法自行修改为末尾添加的版本,原脚本如下:
for(i in 1:length(df)){ df[[i]] <- df[[i]] %>% filter(!is.na(Z)) %>% slice(1) %>% mutate(across(col1:col3, ~ 0)) %>% filter(!grepl("VALUE1", Z)) %>% mutate(Z = "VALUE1") %>% bind_rows(., df[[i]]) }
修改后的脚本(带逐行注释)
# 循环遍历列表中的每一个数据框 for(i in 1:length(df)){ df[[i]] <- df[[i]] %>% filter(!is.na(Z)) %>% # 过滤掉Z列为NA的行,只保留有有效值的行 slice(n()) %>% # 取过滤后的最后一行,对应原数据框Z列最后一个非NA值的行 mutate(across(col1:col3, ~ 0)) # 将需要设置为0的列(col1到col3)统一赋值为0 filter(!grepl("VALUE1", Z)) %>%# 判断该行Z值是否不含VALUE1,只有满足条件时才保留该行用于添加 mutate(Z = "VALUE1") %>% # 将Z列的值替换为目标值VALUE1 bind_rows(df[[i]], .) # 把构造好的新行绑定到原数据框的末尾 }
核心修改点
- 将
slice(1)替换为slice(n()):从获取Z列第一个非NA行,改为获取最后一个非NA行,以此判断末尾的有效值是否符合添加条件。 - 将
bind_rows(., df[[i]])调整为bind_rows(df[[i]], .):把新行的绑定顺序从“新行在前、原数据框在后”改成“原数据框在前、新行在后”,实现末尾添加。
内容的提问来源于stack exchange,提问作者rjuri
相关产品推荐
相关产品推荐

