【问题标题】:Delete rows in which values are below threshold across all columns删除所有列中值低于阈值的行
【发布时间】:2020-08-21 15:27:41
【问题描述】:

我有一个包含 15,000 行和 350 列(1 列包含字符串,其余所有数字)的数据框,我想在其中删除所有整数列中包含低于某个数字的数字的行。

示例数据:

df1 <- data.frame(
 ID = c("Gene1", "Gene2", "Gene3", "Gene4", "Gene5"),
              var1 = c(245, 2, 0.4, 34,1098),
              var2 = c(908, 1, 54, 34,856),
              var3 = c(0, 3, 650, 0,6)
)

threshold <- 3
> df1
 ID   var1 var2 var3
1 Gene1  245.0  908    0
2 Gene2    2.0    1    3
3 Gene3    0.4   54  650
4 Gene4   34.0   34    0
5 Gene5 1098.0  856    6

期望的输出:

> df1
     ID   var1 var2 var3
1 Gene1  245.0  908    0
3 Gene3    0.4   54  650
4 Gene4   34.0   34    0
5 Gene5 1098.0  856    6

Gene2(在所有列中包含低于 3 的数字)已消失。我怎样才能做到这一点?谢谢!

【问题讨论】:

  • df1[rowSums(df1[-1]&lt;=3)!=ncol(df1[-1]), ] 甚至subset(df1, rowSums(df1[-1]&lt;=3)!=ncol(df1[-1]))
  • 谢谢,但这是计算这些行的总和。如果一行的值为 1,0,2,2 - 我仍然想完全删除该行,即使总和大于 3。还是我误解了?
  • 请再看一遍代码。它不是对行求和,而是 ii 正在删除行中的所有值都小于 3 的行。如果是对行求和,则 1+2+3=6 而不是 3。代码对生成的 TRUE、FALSE 值求和df[-1]&lt;=3 nd 不是单个值。这是正确的代码
  • 知道了,完全是我的错。这实际上是非常简洁的代码,非常感谢!

标签: r tidyverse


【解决方案1】:

试试这个:

> library(dplyr)

> df1 %>% filter_all(any_vars(is.numeric(.) & . > 3))

     ID   var1 var2 var3
1 Gene1  245.0  908    0
2 Gene3    0.4   54  650
3 Gene4   34.0   34    0
4 Gene5 1098.0  856    6

【讨论】:

    【解决方案2】:

    接下来是tidyverse 方法(但@Onyambu 非常理想):

    library(tidyverse)
    
    #Data
    df1 <- data.frame(
      ID = c("Gene1", "Gene2", "Gene3", "Gene4", "Gene5"),
      var1 = c(245, 2, 0.4, 34,1098),
      var2 = c(908, 1, 54, 34,856),
      var3 = c(0, 3, 650, 0,6)
    )
    
    threshold <- 3
    
    #Code
    df1 %>% pivot_longer(-ID) %>% group_by(ID) %>%
      mutate(Flag=sum(value<=3)) %>%
      filter(Flag!=3) %>% select(-c(Flag)) %>%
      pivot_wider(names_from = name, values_from=value)
    

    输出:

    # A tibble: 4 x 4
    # Groups:   ID [4]
      ID      var1  var2  var3
      <fct>  <dbl> <dbl> <dbl>
    1 Gene1  245     908     0
    2 Gene3    0.4    54   650
    3 Gene4   34      34     0
    4 Gene5 1098     856     6
    

    【讨论】:

    • 也许我的问题不清楚,但我认为这是对所有列的行值求和。如果一行的值为 1,0,2,2 - 我仍然想完全删除该行,即使总和大于 3。不过我确实学到了一些有用的函数,谢谢!
    • @Workhorse 很好,你学到了一些功能,输出整洁,我认为你可以做你想做的事:) 如果无论如何你觉得这个答案有用,你可以投票!!
    猜你喜欢
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多