我想删除这个数据帧中的行:

a)在所有列中包含NAs。下面是我的示例数据帧。

             gene hsap mmul mmus rnor cfam
1 ENSG00000208234    0   NA   NA   NA   NA
2 ENSG00000199674    0   2    2    2    2
3 ENSG00000221622    0   NA   NA   NA   NA
4 ENSG00000207604    0   NA   NA   1    2
5 ENSG00000207431    0   NA   NA   NA   NA
6 ENSG00000221312    0   1    2    3    2

基本上,我想获得如下所示的数据帧。

             gene hsap mmul mmus rnor cfam
2 ENSG00000199674    0   2    2    2    2
6 ENSG00000221312    0   1    2    3    2

b)只在某些列中包含NAs,所以我也可以得到这个结果:

             gene hsap mmul mmus rnor cfam
2 ENSG00000199674    0   2    2    2    2
4 ENSG00000207604    0   NA   NA   1    2
6 ENSG00000221312    0   1    2    3    2

当前回答

我们也可以用子集函数。

finalData<-subset(data,!(is.na(data["mmul"]) | is.na(data["rnor"])))

这将只给出那些在mmul和rnor中都没有NA的行

其他回答

使用dplyr包,我们可以过滤NA如下:

dplyr::filter(df,  !is.na(columnname))

这将返回至少有一个非na值的行。

final[rowSums(is.na(final))<length(final),]

这将返回至少有两个非na值的行。

final[rowSums(is.na(final))<(length(final)-1),]

如果希望控制每行有多少个NAs是有效的,请尝试此功能。对于许多调查数据集,过多的空白问题回答可能会破坏结果。所以它们在某个阈值之后就会被删除。这个函数允许你在删除行之前选择有多少个NAs:

delete.na <- function(DF, n=0) {
  DF[rowSums(is.na(DF)) <= n,]
}

默认情况下,它将消除所有NAs:

delete.na(final)
             gene hsap mmul mmus rnor cfam
2 ENSG00000199674    0    2    2    2    2
6 ENSG00000221312    0    1    2    3    2

或指定允许的最大NAs数量:

delete.na(final, 2)
             gene hsap mmul mmus rnor cfam
2 ENSG00000199674    0    2    2    2    2
4 ENSG00000207604    0   NA   NA    1    2
6 ENSG00000221312    0    1    2    3    2

关于你的第一个问题,我有一个我很熟悉的代码来摆脱所有NAs。感谢@Gregor让它变得更简单。

final[!(rowSums(is.na(final))),]

对于第二个问题,代码只是之前解决方案的一个替换。

final[as.logical((rowSums(is.na(final))-5)),]

注意-5是数据中的列数。这将消除具有所有NAs的行,因为rowsum加起来等于5,并且它们在减法后变为零。这一次,作为。逻辑是必要的。

使用{dplyr}包中的filter()函数和across()帮助函数是一种既通用又能产生可读性较好的代码的方法。

library(dplyr)

vars_to_check <- c("rnor", "cfam")

# Filter a specific list of columns to keep only non-missing entries

df %>% 
  filter(across(one_of(vars_to_check),
                ~ !is.na(.x)))

# Filter all the columns to exclude NA
df %>% 
  filter(across(everything(),
                ~ !is.na(.)))

# Filter only numeric columns
df %>%
  filter(across(where(is.numeric),
                ~ !is.na(.)))

类似地,在dplyr包中也有变体函数(filter_all, filter_at, filter_if),它们完成同样的事情:

library(dplyr)

vars_to_check <- c("rnor", "cfam")

# Filter a specific list of columns to keep only non-missing entries
df %>% 
  filter_at(.vars = vars(one_of(vars_to_check)),
            ~ !is.na(.))

# Filter all the columns to exclude NA
df %>% 
  filter_all(~ !is.na(.))

# Filter only numeric columns
df %>%
  filter_if(is.numeric,
            ~ !is.na(.))