【问题标题】:Getting unique and overlapping counts for values in R dataframes [closed]获取R数据框中值的唯一和重叠计数[关闭]
【发布时间】:2014-06-16 08:49:53
【问题描述】:

我有这个大型数据框,其中包含重复 ID 的记录,这些记录位于多个组中,如下所示:

ID   GROUP               
--   ------
1    GROUPA                      
1    GROUPB                      
3    GROUPA                      
3    GROUPC                      
3    GROUPC                      
2    GROUPB                      

如何获得每个组中唯一记录的计数,以及组之间重叠的 ID 数量?喜欢:

#         Unique To Group    Overlap with others     Uniques not in group
------    ---------------    -------------------     -------------------
GROUPA          1                    2                     1
GROUPB          1                    1                     2
GROUPC          1                    1                     2

所以重叠是由 ID:

  • 如果 ID 对 GROUP 是唯一的 - 那么对 Group 是唯一的
  • 如果 ID 在其他组中重复,则为重叠
  • 如果 ID 不存在于组中但存在于其他组中 - 它在组中不是唯一的

目前我正在考虑在这样的循环中执行此操作:

GROUPA = df[which(df$Group == 'A'), ]
for (id in df$id) {
  if is.element(id, GROUPA):
    GroupACount <- GroupACount+1
etc

但不确定如何进行重叠。但是是否有更好的方法可以使用 apply 和 %in%?

提前致谢

【问题讨论】:

  • 问题不是很清楚。我看不到重叠是如何计算的
  • @sayandasgupta - 抱歉,刚刚添加了说明。
  • 您想要的输出是否代表您提供的数据?
  • 对于未来的问题,始终提供与所提供数据相对应的所需输出,否则您只是在浪费大家的时间
  • 我也不明白输出是如何构造的。如果您希望每个组 inside 没有唯一性,则“A”和“B”应该有 2 个(因为 2 个 ID 在每个组中出现 一次),而“C”应该有 1 (ID 3 出现两次),不是吗?如果您希望每个组都没有唯一性,那么“A”和“C”应该有0,“B”应该有1?在“unique_not”中,您是否计算存在于任何地方但在特定组中的 ID?另外,我也没有“重叠”。您能否逐步解释一下您的输出中的一行是如何构造的?抱歉,如果我遗漏了什么,但我真的不明白发生了什么。

标签: r loops dataframe unique


【解决方案1】:

本着提供对您仍然有用的快速而肮脏的答案的精神,这是使用 for() 循环的不完美解决方案。也许其他人可以通过矢量化来改进它。

#slight expansion of your sample data
> d <- data.frame(id = c(1, 1, 3, 3, 3, 2, 4, 2, 3), group = c("A", "B", "A", "C", "C", "B", "D", "E", "E"))

# create empty storage matrix
> myDF <- matrix(numeric(0), ncol=4)
# for loop
> for(i in unique(d$group)) {
    #get IDs of this group, and IDs of all other groups
    groupIDs <- unique(d[d$group == i,]$id,)
    otherIDs <- unique(d[d$group != i,]$id,)

    #number of unique IDs in group
    test1 <- groupIDs %in% otherIDs
    uniques_in_group <- length(test1[test1 == FALSE])

    #number of IDs overlapping with other groups
    overlaps <- length(test1[test1 == TRUE])

    #number of unique IDs not in group
    test2 <- otherIDs %in% groupIDs
    uniques_not_in_group <- length(test2[test2 == FALSE])

    #build dataframe
    myDF_i <- data.frame(group = i, uniques_in_group, overlaps, uniques_not_in_group)
    myDF <- rbind(myDF, myDF_i)
}

> myDF

#   group uniques_in_group overlaps uniques_not_in_group
# 1     A                0        2                    2
# 2     B                0        2                    2
# 3     C                0        1                    3
# 4     D                1        0                    3
# 5     E                0        2                    2

【讨论】:

  • 这真是一个很好的尝试,谢谢
【解决方案2】:

这是使用@jogal 提供的示例数据的dyplr 解决方案。

require(dplyr)

d %>% mutate(ids = length(unique(id)),
              n = 1:n(),
              countInOthers = sapply(n, function(currentn){sum(ID[group != group[currentn]] == ID[n == currentn])})) %>%
  group_by(group) %>%
  summarize(UniqueInGroup = length(unique(id[countInOthers == 0])),
            OverlapWithOthers = length(unique(ID[countInOthers>0])),
            UniquesNotInGroup = ids[1] - UniqueInGroup - OverlapWithOthers)

#  group  UniqueInGroup OverlapWithOthers UniquesNotInGroup
#1     A             0                 2                 2
#2     B             0                 2                 2
#3     C             0                 1                 3
#4     D             1                 0                 3
#5     E             0                 2                 2

使用问题中的样本数据,结果将是:

#   group UniqueInGroup OverlapWithOthers UniquesNotInGroup
#1 GROUPA             0                 2                 1
#2 GROUPB             1                 1                 1
#3 GROUPC             0                 1                 2

【讨论】:

  • 这与预期的结果不一致......这只是意味着没有人了解 OP 想要什么
  • @DavidArenburg 你是对的!但根据我认为的描述(不是所需输出中实际显示的内容)。
  • @beginneR 谢谢!这似乎也有效。唯一的问题是它的运行速度比 jogal 对我的大数据集的回答慢很多。
  • @DavidArenburg - 我提出的“期望结果”主要是为了展示这个概念,我试图让它尽可能正确,但那里有几个错误。
猜你喜欢
  • 2023-03-19
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多