【问题标题】:How to remove certain rows from data frame based on other columns in R?如何根据 R 中的其他列从数据框中删除某些行?
【发布时间】:2021-02-23 02:21:39
【问题描述】:

我想根据数据框中其他列中的其他条目从数据框中删除某些行。例如,如果我有一个如下所示的数据框:

 asd <- data.frame(
  var_1 = as.factor(c("a1", "a2", "a3", "a1", "a2", "a3", "a1", "a2", "a3")),
  var_2 = as.factor(c("a1", "a1", "a1", "a2", "a2", "a2", "a3", "a3", "a3")),
  var_3 = c("NO", "YES","YES","YES","NO", "YES","YES","YES","NO"),
  var_4 = c(0, 2, 4, 2, 0, 7, 4, 7, 0)
)
> asd
  var_1 var_2 var_3 var_4
1    a1    a1    NO     0
2    a2    a1   YES     2
3    a3    a1   YES     4
4    a1    a2   YES     2
5    a2    a2    NO     0
6    a3    a2   YES     7
7    a1    a3   YES     4
8    a2    a3   YES     7
9    a3    a3    NO     0

我想删除 var_3 列中包含 NO 的每一行(幸运的是,NO 总是等间距的,所以我可以利用这一事实来帮助删除它们)

...而且我还想删除所有重复项。我所说的重复是指,例如,第 2 行有a2a1,第4 行有a1a2...这些行是彼此重复的。

为了实现这一点,我使用了以下代码:

# This line removes all the rows with NO 
asdf <- asd[-seq(1, NROW(asd), by = 4), ]
# This line removes the duplicate rows
asdf <- asdf[!duplicated(t(apply(asdf, 1, sort))), ] 

这会导致:

> asdf
  var_1 var_2 var_3 var_4
2    a2    a1   YES     2
3    a3    a1   YES     4
6    a3    a2   YES     7

这正是我想要的结果……但我想知道是否有一种更简单、更简洁的方法来实现这个结果(最好使用基础 R……但这不是一个牢不可破的规则)?

非常感谢任何建议

【问题讨论】:

    标签: r


    【解决方案1】:

    避免使用apply 的基本 R 方式:

    pmin/pmax 执行按行排序,duplicated 我们删除重复项并删除具有var3 = 'NO' 的行。

    result <- transform(asd, var_1 = pmin(var_1, var_2), var_2 = pmax(var_1, var_2))
    subset(result, (!duplicated(result[1:2])) &  var_3 != 'NO')
    
    #  var_1 var_2 var_3 var_4
    #2    a1    a2   YES     2
    #3    a1    a3   YES     4
    #6    a2    a3   YES     7
    

    【讨论】:

    • 这是一个很好的答案。但是,我犯了一个错误,忘记在我原来的问题中添加细节。在我的数据集中,var_1var_2 是因素...我将编辑问题以反映这一事实。
    • 在这种情况下,您需要将列更改为字符才能使此答案起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2018-02-27
    • 2022-08-05
    • 2021-06-16
    相关资源
    最近更新 更多