我有一个data.table
,其中包含我需要测试是否相等的几列。
library(data.table)
dt <- data.table(a = 1:5,
b = c("cat1", "cat1", "cat2", "cat4", "cat1"),
c = c("cat2", "cat1", "cat2", "cat4", "cat3"),
d = c("cat3", "cat1", "cat4", "cat4", "cat5"))
> dt
a b c d
1: 1 cat1 cat2 cat3
2: 2 cat1 cat1 cat1
3: 3 cat2 cat2 cat4
4: 4 cat4 cat4 cat4
5: 5 cat1 cat3 cat5
我要保留行b
,c
和d
不具有相同值的行。 (我想检查该行的所有列中cats
都不相同的行。)在我的实际问题中,我有更多列,但它们具有相似的名称。这似乎应该很容易,但是我要简短了。
这不起作用。
> dt[length(unique(c(b, c, d))) > 1]
a b c d
1: 1 cat1 cat2 cat3
2: 2 cat1 cat1 cat1
3: 3 cat2 cat2 cat4
4: 4 cat4 cat4 cat4
5: 5 cat1 cat3 cat5
我想也许我需要先创建一列然后进行过滤,但是使该列计算每行中唯一值的数量不起作用。它基于整个列集来完成。
dt[, unique_cats := length(unique(c(b, c, d)))]
dt
a b c d unique_cats
1: 1 cat1 cat2 cat3 5
2: 2 cat1 cat1 cat1 5
3: 3 cat2 cat2 cat4 5
4: 4 cat4 cat4 cat4 5
5: 5 cat1 cat3 cat5 5
使用来自this question的信息,我还尝试在.I
子句中包含一个by
自变量,但这也不起作用。
> dt[,
+ unique_cats := length(unique(c(b, c, d))),
+ by = .I]
> dt
a b c d unique_cats
1: 1 cat1 cat2 cat3 5
2: 2 cat1 cat1 cat1 5
3: 3 cat2 cat2 cat4 5
4: 4 cat4 cat4 cat4 5
5: 5 cat1 cat3 cat5 5
我在这里做错了什么?