如何在R中保留两个变量中具有相同值的行?

3

我有一个包含多个变量的数据集,但是我想要保留那些基于两列相同的行。以下是我想要执行的示例:

a <- c(rep('A',3), rep('B', 3), rep('C',3))
b <- c(1,1,2,4,4,4,5,5,5)
df <- data.frame(a,b)

  a b
1 A 1
2 A 1
3 A 2
4 B 4
5 B 4
6 B 4
7 C 5
8 C 5
9 C 5

我知道如果我使用复制函数,我可以得到:

df[!duplicated(df),]

  a b
1 A 1
3 A 2
4 B 4
7 C 5

但是由于列a上的'A'等级在列b中没有唯一值,因此我想要删除这两个观察值,得到一个新的数据框:

  a b
4 B 4
7 C 5

我不介意在b中有重复的值,只要对于a上的每个相同级别,在b中都有相同的值。

有没有办法做到这一点?谢谢!

3个回答

2
这个可能是吗?
ag <- aggregate(b~a, df, unique)
ag[lengths(ag$b)==1,]

#  a b
#2 B 4
#3 C 5

1
这并不测试“A”值是否在“b”中。 - Pierre L
1
多个B值对于丢弃所有A行足够了。这样做很好。 - hedgedandlevered
1
@PierreLafortune 我认为原帖作者应该更清楚地阐明逻辑。 - 989
1
最好等待原帖作者澄清以获得更多明确信息。 - Pierre L
1
@989 是的,我不介意在“b”中有重复的值,只要在每个相同层级的“a”上都有相同的值。 - Ulises
显示剩余6条评论

0

可能是这样的:

> ind <- apply(sapply(with(df, split(b,a)), diff), 2, function(x) all(x==0) )
> out <- df[!duplicated(df),]
> out[out$a %in% names(ind)[ind], ]
  a b
4 B 4
7 C 5

0

这里有另一种使用 data.table 的选项

library(data.table)
setDT(df)[, if(uniqueN(b)==1) .SD[1L], by = a]
#   a b
#1: B 4
#2: C 5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接