检查多列是否相等

时间:2019-07-02 14:00:42

标签: r data.table

我有一个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

我要保留行bcd不具有相同值的行。 (我想检查该行的所有列中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

我在这里做错了什么?

0 个答案:

没有答案