Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果在dplyr中被名称引用的某些变量为NA,则删除数据帧行_R_Dataframe_Filter_Dplyr - Fatal编程技术网

如果在dplyr中被名称引用的某些变量为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)

如果数据帧中的所有行都有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) <- 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]