【问题标题】:Delete rows based on range of values in column根据列中的值范围删除行
【发布时间】:2014-11-04 01:35:39
【问题描述】:

如果列中的值(在本例中为参与者标识号)在某个范围内,例如,我想删除 dataframe 中的数据行。 61701 至 61721 和 61901 至 61929。

我知道如何根据阈值对数据进行子集化,例如:

datasetnew = dataset[dataset$X<=100, ]

但不确定如何使用一系列数字对行进行子集化和删除。不确定子集是我需要的。

【问题讨论】:

  • 尚未测试,但可能很简单,例如 dataset[(dataset$X &gt;= 61701 &amp; dataset$X &lt;= 61721) | (dataset$X &gt;= 61901 &amp; dataset$X &lt;= 61929),]dataset[dataset$X %in% 61701:61721) | (dataset$X %in% 61901:61929),]。可能也可以使用with 以减少dataset 调用
  • 感谢大卫,这非常适合对数据进行子集化。我想要做的是从数据框中删除那些特定的行。我应该考虑更多的!

标签: r rows subset


【解决方案1】:

您应该能够通过包含小于、大于和介于它们之间的所有内容来排除这些范围。比如:

dataset[dataset$X < 61701 | dataset$X > 61929 | (dataset$X > 61721 & dataset$X < 61901),]

或者使用subset:

subset(dataset, X < 61701 | X > 61929 | (X > 61721 & X < 61901)

【讨论】:

    【解决方案2】:

    使用dplyr 包:

    exclude <- c(61701:61721, 61901:61929)
    
    library(dplyr)
    datasetnew <- dataset %>%
      filter(!(X %in% exclude))
    

    【讨论】:

      【解决方案3】:

      或者更直接的实现将只是使用 ! 否定这些行

      dataset[with(dataset, !((X >= 61701 & X <= 61721) | (X >= 61901 & X <= 61929))), ]
      

      或者

      dataset[with(dataset, !((X %in% 61701:61721) | (X %in% 61901:61929))), ]
      

      对于大数据集,您可以使用data.tables %between% 函数

      library(data.table)
      setDT(dataset)[!(X %between% c(61701, 61721) | X %between% c(61901, 61929))]
      

      【讨论】:

        猜你喜欢
        • 2018-04-28
        • 1970-01-01
        • 2021-05-15
        • 2022-11-21
        • 1970-01-01
        • 1970-01-01
        • 2019-07-06
        • 1970-01-01
        • 2015-11-14
        相关资源
        最近更新 更多