【问题标题】:Filtering rows in R when less than half rowcells meet a condition当少于一半的行单元满足条件时过滤R中的行
【发布时间】:2019-06-05 16:55:03
【问题描述】:

我有一个包含 276 列样本和 215000 行的矩阵。这些值的范围从零到某个非负值。

我将使用 mtcars 作为简化示例

我需要过滤掉少于 50%(可以是任何百分比)的样本未达到特定值的行,例如 1。

示例矩阵:

Tmtcars <- t(mtcars[1:5,c(2, 8:11)])

我需要选择至少 50% 的单元格等于或大于 1 的行。

只有“vs = c(0,0,1,1,0)”这一行不满足这个条件。因为只有 2 个单元格 (40%) 为 1 或更大。

应选择“am = c(1,1,1,0,0)”行,因为 3 个单元格 (60%) 等于或大于 1。

如果我运行 rowMeans 函数

Filtered <- Tmtcars[(rowMeans(Tmtcars) >= 1 ) >=0.5, ]

“am”行未被选中。

选择标准必须是 50% 的单元格是否符合标准,与平均值无关。

谢谢!

【问题讨论】:

  • 您可能可以使用DF3[rowMeans(DF3[,1:20] &gt; 2) &lt; 0.5,] 之类的东西,但如果没有可重复的示例,就很难说。你能分享dput(head(DF3))的输出吗?
  • 如果你想要一个数据框,最好使用矩阵或长格式。如果您有不同数量的样本,那么长格式可能会有意义。逐行操作在数据帧上通常效率低下。
  • 谢谢,为了清楚起见和可重复的示例,我已经编辑了问题。我可以将我的 DF 格式化为矩阵。

标签: r dataframe cell


【解决方案1】:

你可以使用rowSums():

set.seed(1)
sample1 <- c(sample(1:10, 5))
sample2 <- c(sample(1:10, 5))
sample3 <- c(sample(1:10, 5))
sample4 <- c(sample(1:10, 5))
sample5 <- c(sample(1:10, 5))

df <- data.frame(sample1, sample2, sample3, sample4, sample5)

df2 <- df[rowSums(df > 2) > (ncol(df)/2),]

您显然可以使用这些值。第一个2是要比较的值,第二个2是寻找比较匹配超过50%的行。

【讨论】:

  • 我仍然坚持我的答案:) filtered &lt;- Tmtcars[rowSums(Tmtcars &gt;= 1) &gt; (ncol(Tmtcars)/2),]
【解决方案2】:

在您的情况下,您可以使用

DF3[rowMeans(DF3[,1:20]) > 2 )>0.5, ]

【讨论】:

    【解决方案3】:

    真/假参数在 R 中有数值。

    TRUE + TRUE ; FALSE + FALSE ; FALSE + TRUE
    

    您可以使用此功能并求和来选择多行

    sum( 5 == c( 3, 5, 5, 2))
    

    您可以像这样子集行。当条件为真5次以上时,我们根据条件进行子集化

    if( sum( mtcars$mpg >20 ) > 5 ) mtcars[  mtcars$mpg >20 , ]
    

    您还可以创建逻辑向量,以子集化或创建新变量

    # more than five times - mpg greater than 20
        rows <- rep(sum( mtcars$mpg >20 ) > 5, nrow( mtcars))  & mtcars$mpg >20 
    
    # more than 25 times
        rowshigher <- rep(sum( mtcars$mpg >20 ) > 25, nrow( mtcars))  & mtcars$mpg >20 
    
    mtcars[ rows , ]
    

    【讨论】:

      【解决方案4】:

      谢谢,我已经修改了一些答案,最后我找到了 3 种可以给我相同结果的方法

      F1 <- Tmtcars[rowSums(Tmtcars >= 1) >= (ncol(Tmtcars)/2), ]
      
      F1b <- Tmtcars[rowMeans(Tmtcars >= 1) >= 0.5, ]
      
      F2 <- Tmtcars[apply(Tmtcars, 1, function(x) mean(x>=1)>=0.5),]
      

      【讨论】:

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