请考虑以下示例数据框。
> 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(如果所有类别的col2
在col1
中具有完全不同的值集合),则为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
检查常用值,但这是一种冗长且低效的过程对于大型数据框架。有人能为我提供有效的解决方案吗?任何数据表解决方案也都可以。
答案 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,duplicated
和any
与anyDuplicated
的组合:
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