【问题标题】:Filter rows based on multiple column conditions R根据多列条件过滤行 R
【发布时间】:2013-09-06 12:42:22
【问题描述】:

假设我有一个包含 100 多列的数据集,并且我只需要保留数据中满足应用于所有 100 列的一个条件的那些行。我该怎么做?

假设,如下所示...我只需要保留 Col1 或 2 或 3 或 4 中的任何一个 >0 的行

Col1 Col2 Col3 Col4 
1 1 3 4 
0 0 4 2 
4 3 4 3 
2 1 0 2 
1 2 0 3 
0 0 0 0

在上面的示例中,除了最后一行,所有行都会成功。我需要将结果放在与原始数据相同的数据框中。不确定我是否可以使用 lapply 循环遍历 > 0 的列,或者我可以使用子集.. 任何帮助表示赞赏

我可以使用列索引并执行df<-subset(df,c(2:100)>0)。这并没有给我正确的结果。

【问题讨论】:

    标签: r subset multiple-columns


    【解决方案1】:

    假设您的 data.frame 是 DF,那么使用 [ 将为您完成这项工作。

    > DF[DF[,1]>0 | DF[,2] >0 | DF[,3] >0 | DF[,4] >0, ]
      Col1 Col2 Col3 Col4
    1    1    1    3    4
    2    0    0    4    2
    3    4    3    4    3
    4    2    1    0    2
    5    1    2    0    3
    

    如果您有数百列,则可以使用这种替代方法

    > DF[rowSums(DF)=!0, ]
      Col1 Col2 Col3 Col4
    1    1    1    3    4
    2    0    0    4    2
    3    4    3    4    3
    4    2    1    0    2
    5    1    2    0    3
    

    【讨论】:

    • 嘿 Jilber,如果我有 100 多列,我应该输入 100 次吗?.. 不确定这是否理想.. 请告诉我
    • 虽然第一个解决方案适用于所有实数,但第二个解决方案仅限于非负数。
    【解决方案2】:
    dat <- read.table(header = TRUE, text = "
      Col1 Col2 Col3 Col4 
      1 1 3 4 
      0 0 4 2 
      4 3 4 3 
      2 1 0 2 
      1 2 0 3 
      0 0 0 0
    ")
    

    您可以使用 data.table 自动容纳您的 data.frame 恰好有多少列。这是一种方法,但可能有一种更优雅的方法可以使用 data.table 执行此操作:

    require(data.table)
    dt <- data.table(dat)
    
    dt[rowSums(dt>0)>0]
    
    #    Col1 Col2 Col3 Col4
    # 1:    1    1    3    4
    # 2:    0    0    4    2
    # 3:    4    3    4    3
    # 4:    2    1    0    2
    # 5:    1    2    0    3
    

    【讨论】:

      猜你喜欢
      • 2018-07-10
      • 2021-06-25
      • 1970-01-01
      • 2014-08-12
      • 2018-08-07
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多