【问题标题】:R-Subsetting a data frame conditional to related valuesR-子集以相关值为条件的数据框
【发布时间】:2015-03-23 18:54:26
【问题描述】:

我有这样一个数据框(df):

col1  col2
a     2      
a     3 
b     7
b     5
c     4
c     2
c     1
d     5
d     7

即;

df<-data.frame(col1=c("a","a","b","b","c","c","c","d","d"), col2=c(2,3,7,5,4,2,1,5,7))

所需的输出数据帧(df1)是:

col1  col2
b     7
b     5
d     5
d     7

例如,

col1 中 df 的第一行是 2。相关 col1 值为“a”。然后删除 col1 中包含“a”的所有行。同理,col2 的第 6 行等于 2。相关 col1 的值等于“c”。然后删除 col1 中所有包含“c”的行。

如何使用 R 来做到这一点?我会很高兴得到任何帮助。非常感谢。

【问题讨论】:

  • 对不起。我的意思是添加一个简短的解释。它很脏,但它只是根据条件对 df 进行子集。它找到那些 col2 值小于或等于 2 的唯一 col1 值,并将它们从 df 中删除。 df[-which(df$col1 %in% unique(df$col1[which(df$col2 &lt;=2)])),]
  • 我不知道你在问什么:df[with(df, ave(col2 == 2, col1, FUN = Negate(any))), ]?
  • @Ted Dallas,也感谢您的解决方案:)。还要感谢 rawr:)。

标签: r


【解决方案1】:

你可以试试

library(data.table)
setDT(df)[, .SD[!col1 %in% col1[col2==2]]]
#    col1 col2
#1:    b    7
#2:    b    5
#3:    d    5
#4:    d    7

或使用dplyr

library(dplyr)
filter(df, !col1 %in% col1[col2==2])

【讨论】:

  • 不喜欢基础 R 解决方案?! :) @akrun 的解决方案是可靠的。
  • @akrun 您也可以使用基础 R subset(df,!col1%in%col1[col2==2]) 制定您的第二个解决方案
  • @cryo111 谢谢,可以。我看到您发布了解决方案并将其删除。你为什么删除它?
  • @akrun 我删除了它,因为我看到它只是对您的解决方案的一个小改动。但我可以取消删除它。
【解决方案2】:

subset 的基本解决方案。

subset(df,!col1%in%col1[col2==2])

【讨论】:

    猜你喜欢
    • 2023-02-23
    • 2015-11-08
    • 1970-01-01
    • 2020-11-10
    • 2013-10-28
    • 2022-08-21
    • 2021-08-01
    • 2019-06-01
    • 1970-01-01
    相关资源
    最近更新 更多