【问题标题】:How to remove rows from a data frame when a % of columns have a value less than specified?当 % 列的值小于指定值时,如何从数据框中删除行?
【发布时间】:2017-12-10 17:06:51
【问题描述】:

我有一些数据要过滤。我想说,“如果每行的指定百分比包含小于指示的值,则从数据框中删除该行。

这是一些示例数据。

       Sample1, Sample2, Sample3, Sample4, Sample5, Sample6
Item1   0   0   0   0   0   0
Item2   478 440 522 578 1066 1045
Item3   16  14  9   6   6   20

假设我希望删除 50% 的列值小于 10 的行。因此,在这种情况下,删除了 Item1 行,并删除了 Item3 行。

如果我将条件更改为值小于 7 的列的 50%,则只有 Item1 消失,而 Item2 和 Item3 保留。

在 R 中实现此目的的巧妙方法是什么?这是一个简单的问题,我想避免编写凌乱的代码来完成它。从我到目前为止读到的内容来看,我应该用 lapply() 来做这件事吗?我很感激任何见解。

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以通过索引来做到这一点。

    ## reproduce your data
    df = read.table(text="ItemNum Sample1 Sample2 Sample3 Sample4 Sample5 Sample6
    Item1   0   0   0   0   0   0
    Item2   478 440 522 578 1066 1045
    Item3   16  14  9   6   6   20",
    header=TRUE, stringsAsFactors=FALSE)
    
    df = df[which(rowSums(df[,2:7] < 10) < 3), ]
    df
       ItemNum Sample1 Sample2 Sample3 Sample4 Sample5 Sample6
    2   Item2     478     440     522     578    1066    1045
    

    【讨论】:

    • 谢谢,这比我尝试的要好得多。我稍微改变了它以考虑我正在处理的不同数量的列。 df = counts[which(rowSums(counts[,2:ncol(counts)]
    • 使用rowMeans简单一点,去掉which的多余使用,导致df[rowMeans(df[,2:7] &lt; 10) &lt; 0.5, ]
    【解决方案2】:
    library(data.table)
    
    dat <- fread("Item Sample1 Sample2 Sample3 Sample4 Sample5 Sample6
                  Item1   0   0   0   0   0   0
                  Item2   478 440 522 578 1066 1045
                  Item3   16  14  9   6   6   20")    
    
    slice_val <- 10
    dat[apply(dat[, !"Item"], 1, function(x) sum(x > slice_val)/length(x)) > 0.5]
    
        Item Sample1 Sample2 Sample3 Sample4 Sample5 Sample6
    1: Item2     478     440     522     578    1066    1045
    
    slice_val <- 7
    dat[apply(dat[, !"Item"], 1, function(x) sum(x > slice_val)/length(x)) > 0.5]
    
        Item Sample1 Sample2 Sample3 Sample4 Sample5 Sample6
    1: Item2     478     440     522     578    1066    1045
    2: Item3      16      14       9       6       6      20
    

    【讨论】:

      猜你喜欢
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多