根据具有有效值的行数从数据框中删除列

时间:2019-07-17 14:34:56

标签: r dplyr

我有一个数据框:

adc

我想使所有这些列(加上第一列,基因)都具有大于或等于至少2个有效值(即不是NA)。我该怎么做?

我在想这样的事情...

df = data.frame(gene = c("a", "b", "c", "d", "e"),
                value1 = c(NA, NA, NA, 2, 1),
                value2 = c(NA, 1, 2, 3, 4),
                value3 = c(NA, NA, NA, NA, 1))

谢谢

2 个答案:

答案 0 :(得分:4)

我们可以sum的非NA元素并创建逻辑条件以select感兴趣的列

library(dplyr)
df1 <- df %>%
          select_if(~ sum(!is.na(.)) > 2)
df1
#   gene value2
#1    a     NA
#2    b      1
#3    c      2
#4    d      3
#5    e      4

或者另一个选择是keep

library(purrr)
keep(df, ~ sum(!is.na(.x)) > 2)

或根据行数创建条件

df %>%
   select_if(~ mean(!is.na(.)) > 0.5)

或使用Filter中的base R

Filter(function(x) sum(!is.na(x)) > 2, df)

答案 1 :(得分:2)

我们可以在基数R中使用colSums来计算每列的非NA值

df[colSums(!is.na(df)) > 2]

#  gene value2
#1    a     NA
#2    b      1
#3    c      2
#4    d      3
#5    e      4

或使用apply

df[apply(!is.na(df), 2, sum) > 2]