当x数据集某变量全为NA时,如何移除对应x、y数据集的行?
问题描述
现有合并了变量与时间匹配的两组时间序列数据,其中x数据集的value列可能全为数值、部分为NA或全为NA,y数据集的value列无NA值。需求是:当x数据集的某个var分组下value全为NA时,移除该var对应的所有x、y数据集的行。
示例数据
var <- c("a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "c", "c", "c", "c", "c", "c") value <- c(1, 2, NA, 4, 3, 2, NA, NA, NA, 3, 3, 3, 4, 2, 1, 2, 5, 4) time <- c(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3) dataset <- c("x", "x", "x", "y", "y", "y", "x", "x", "x", "y", "y", "y", "x", "x", "x", "y", "y", "y") Test.df <- data.frame(var, value, time, dataset)
原始数据输出:
var value time dataset a 1 1 x a 2 2 x a NA 3 x a 4 1 y a 3 2 y a 2 3 y b NA 1 x b NA 2 x b NA 3 x b 3 1 y b 3 2 y b 3 3 y c 4 1 x c 2 2 x c 1 3 x c 2 1 y c 5 2 y c 4 3 y
期望结果
var value time dataset a 1 1 x a 2 2 x a NA 3 x a 4 1 y a 3 2 y a 2 3 y c 4 1 x c 2 2 x c 1 3 x c 2 1 y c 5 2 y c 4 3 y
解决方案
方法1:基础R实现
先筛选出x数据集中value不全为NA的var列表,再保留原数据中属于这些var的行:
# 提取x数据集里value不全为NA的var valid_vars <- with(subset(Test.df, dataset == "x"), tapply(value, var, function(x) any(!is.na(x)))) %>% which() %>% names() # 过滤原数据得到结果 result_df <- Test.df[Test.df$var %in% valid_vars, ]
方法2:dplyr(tidyverse)实现
利用分组筛选逻辑,更简洁直观:
library(dplyr) result_df <- Test.df %>% group_by(var) %>% filter(any(dataset == "x" & !is.na(value))) %>% ungroup()
逻辑说明:按var分组后,只要该分组下存在x数据集且value不为NA的记录,就保留整个分组的所有行,自动排除x数据集下value全为NA的var。
内容的提问来源于stack exchange,提问作者Methos
相关产品推荐
相关产品推荐

