如果在dplyr中被名称引用的某些变量为NA,则删除数据帧行
如果数据帧中的所有行都有NAs,但只有特定的列子集(按顺序命名并以“X”开头),那么我希望从数据帧中删除整行 这与其他答案不同,因此我可以从中找到答案,因为我无法按名称手动引用每一列(变量太多),并且不想在行完全为NA(而不是某些变量完全为NA)时删除这些行 因此,将样本数据:如果在dplyr中被名称引用的某些变量为NA,则删除数据帧行,r,dataframe,filter,dplyr,R,Dataframe,Filter,Dplyr,如果数据帧中的所有行都有NAs,但只有特定的列子集(按顺序命名并以“X”开头),那么我希望从数据帧中删除整行 这与其他答案不同,因此我可以从中找到答案,因为我无法按名称手动引用每一列(变量太多),并且不想在行完全为NA(而不是某些变量完全为NA)时删除这些行 因此,将样本数据: data1 <- as.data.frame(rbind(c(1,2,3), c(1, NA, 4), c(4,6,7), c(1, NA, NA), c(4, 8, NA))) colnames(data1)
data1 <- as.data.frame(rbind(c(1,2,3), c(1, NA, 4), c(4,6,7), c(1, NA, NA), c(4, 8, NA)))
colnames(data1) <- c("Z","X1","X2")
data1
Z X1 X2
1 1 2 3
2 1 NA 4
3 4 6 7
4 1 NA NA
5 4 8 NA
即,如果X1和X2(所有X序列)均为NA,则删除该行
在这个例子中,只有两个变量(X1:X2)比较简单,但实际上我有接近100个这个序列,还有许多其他重要的变量,可能是NA,也可能不是NA。我更愿意在dplyr中使用过滤器,但也希望使用其他解决方案
我觉得:
data2 %>% filter(!is.na(all(X1:X2)))
或者类似的东西很接近,但R不喜欢过滤器中对X1:X2的序列引用 您可以使用
rowSums+select+start\u+filter
:
data1 %>%
filter(rowSums(!is.na(select(., starts_with("X")))) != 0)
# Z X1 X2
#1 1 2 3
#2 1 NA 4
#3 4 6 7
#4 4 8 NA
使用
apply
的基本R解决方案是:
drop <- which(apply(data1[,startsWith(colnames(data1), "X")], 1, function(x) all(is.na(x))))
data1[-drop,]
# Z X1 X2
#1 1 2 3
#2 1 NA 4
#3 4 6 7
#5 4 8 NA
drop <- which(apply(data1[,startsWith(colnames(data1), "X")], 1, function(x) all(is.na(x))))
data1[-drop,]
# Z X1 X2
#1 1 2 3
#2 1 NA 4
#3 4 6 7
#5 4 8 NA
drop <- which(rowSums(is.na(data1[,c("X1","X2")]))>=2)
data1[-drop]