另一列的唯一值的一列的唯一值

时间:2015-12-09 14:46:50

标签: r dataframe data.table reshape

请考虑以下示例数据框。

> ww
  col1 col2
1    1    A
2    2    A
3    3    A
4    4    B
5    5    B
6    6    B
7    7    C
8    8    C
9    9    C
> dput(ww)
structure(list(col1 = c(1, 2, 3, 4, 5, 6, 7, 8, 9), col2 = structure(c(1L, 
1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), .Label = c("A", "B", "C"), class = "factor")), .Names = c("col1", 
"col2"), row.names = c(NA, -9L), class = "data.frame")

我想知道col2的每个类别在col1中是否有不同的值。最后,我想得到一个答案(TRUE或FALSE)。 TRUE(如果所有类别的col2col1中具有完全不同的值集合),则为FALSE(如果col2中至少有2个类别在col1中具有至少1个值共同的。

对于上面的示例,答案为TRUE,因为类别A,B和C不具有col1的任何常见值。对于A,col1的值为1,2,3。对于B,col1的值为4,5,6。对于C,col1的值为7,8,9。

我可以尝试按col2分割数据框的数据,然后为每个成员保存col1的值,然后使用intersect检查常用值,但这是一种冗长且低效的过程对于大型数据框架。有人能为我提供有效的解决方案吗?任何数据表解决方案也都可以。

3 个答案:

答案 0 :(得分:4)

你可以这样做:

library(data.table)
setDT(ww)[, un.col1 := uniqueN(col1)==.N, by = col2]

给出:

> ww
   col1 col2 un.col1
1:    1    A   FALSE
2:    1    A   FALSE
3:    3    A   FALSE
4:    4    B    TRUE
5:    5    B    TRUE
6:    6    B    TRUE
7:    1    C    TRUE
8:    8    C    TRUE
9:    9    C    TRUE

或者在评论中提到的@giraffehere,duplicatedanyanyDuplicated的组合:

setDT(ww)[, un.col1 := !anyDuplicated(col1), by = col2]

如果您正在寻找类别之间的唯一性,正如@MatthewPlourde建议的那样,那么您可以使用:

setDT(ww)[, un.col2 := uniqueN(col2) > 1, by = col1]

给出:

> ww
   col1 col2 un.col2
1:    1    A    TRUE
2:    1    A    TRUE
3:    3    A   FALSE
4:    4    B   FALSE
5:    5    B   FALSE
6:    6    B   FALSE
7:    1    C    TRUE
8:    8    C   FALSE
9:    9    C   FALSE

使用过的数据:

ww <- structure(list(col1 = c(1, 1, 3, 4, 5, 6, 1, 8, 9),
                     col2 = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), .Label = c("A", "B", "C"), class = "factor")),
                .Names = c("col1", "col2"), row.names = c(NA, -9L), class = "data.frame")

答案 1 :(得分:2)

我对OP的理解是整个数据帧应该有一个TRUE / FALSE值。这是一个dplyr解决方案:

library(dplyr)

ww %>%
  group_by(col1) %>%
  summarise(ndis = n_distinct(col2)) %>%
  summarise(all(ndis == 1))

答案 2 :(得分:1)

如果某个类别中只能有唯一值,那么您只需要

anyDuplicated(ww$col1) == 0

如果某个类别中可能存在重复项,请使用

删除它们
ww2 <- ww[!duplicated(interaction(ww$col1, ww$col2)), ]

然后在anyDuplicated

上使用col1