【问题标题】:Filtering columns of a data frame according to another column根据另一列过滤数据框的列
【发布时间】:2021-04-01 20:30:46
【问题描述】:

我需要根据每个otu出现的样本数过滤下面的数据框。

   samples otu1 otu2 otu3 otu4 otu5
1        a    2    1    0    0    3
2        b    2    4    1    4    3
3        c    0    0    0    1    0
4        d    0    0    1    4    4
5        e    1    2    0    2    3
6        f    1    1    2    4    2
7        g    1    0    0    4    3
8        h    0    0    2    0    4
9        i    1    2    2    1    6
10       j    0    0    2    3    4

例如,要仅保留 >=80% 的样本中出现的 otus,输出将类似于:

   samples otu4 otu5
1        a    0    3
2        b    4    3
3        c    1    0
4        d    4    4
5        e    2    3
6        f    4    2
7        g    4    3
8        h    0    4
9        i    1    6
10       j    3    4

【问题讨论】:

  • 问题的措辞很好,但数据必须是可重现的。尝试使用dput 函数。

标签: r subset


【解决方案1】:

我们可以使用select

library(dplyr)
df1 %>% 
    select(samples, where(~ is.numeric(.) && mean(. != 0) >= 0.8))

-输出

#     samples otu4 otu5
#1        a    0    3
#2        b    4    3
#3        c    1    0
#4        d    4    4
#5        e    2    3
#6        f    4    2
#7        g    4    3
#8        h    0    4
#9        i    1    6
#10       j    3    4

或者如果我们使用的是较旧的dplyr 版本,请使用select_if

df1 %>%
   select_if(~ is.character(.)|is.numeric(.) && mean(. != 0) >= 0.8)

数据

df1 <- structure(list(samples = c("a", "b", "c", "d", "e", "f", "g", 
"h", "i", "j"), otu1 = c(2L, 2L, 0L, 0L, 1L, 1L, 1L, 0L, 1L, 
0L), otu2 = c(1L, 4L, 0L, 0L, 2L, 1L, 0L, 0L, 2L, 0L), otu3 = c(0L, 
1L, 0L, 1L, 0L, 2L, 0L, 2L, 2L, 2L), otu4 = c(0L, 4L, 1L, 4L, 
2L, 4L, 4L, 0L, 1L, 3L), otu5 = c(3L, 3L, 0L, 4L, 3L, 2L, 3L, 
4L, 6L, 4L)), class = "data.frame", row.names = c("1", "2", "3", 
"4", "5", "6", "7", "8", "9", "10"))

【讨论】:

  • 非常感谢您的快速帮助。不幸的是,我收到以下错误:错误:找不到函数“where”运行rlang::last_error()以查看错误发生的位置。
  • @Gustavo 你能检查你的packageVersion('dplyr') 我用过1.0.4
  • 我的版本是0.8.5。这是更新列表中可用的版本。
  • @Gustavo 你的 R 版本是什么?我用 R 4.0.4
  • @akrun 我刚刚解决了问题并成功更新了 dplyr。现在代码工作正常!谢谢。
猜你喜欢
  • 2014-12-27
  • 1970-01-01
  • 2018-11-12
  • 2019-04-02
  • 2020-12-08
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多