【问题标题】:Count co-occurrences between elements in one column based on second column, and count only if unequal in third column根据第二列计算一列中元素之间的共现,并且仅在第三列不相等时才计算
【发布时间】:2021-09-13 18:25:11
【问题描述】:

我想计算数据框df 中的列c 中唯一元素的每个成对组合在a 列的元素上共同出现的频率,但此外,仅在以下情况下才计算共同出现b 列中的各个值不相等,即以 b 列中的不匹配为条件

a <- c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4)
b <- c(1,1,2,2,2,1,1,2,2,3,3,3,3,1,1,1,2,2,2,4)
c <- c(1,2,1,2,3,2,3,1,2,1,1,2,3,1,2,1,1,2,4,1) 

df <- as.data.frame(cbind(a,b,c))

在不考虑列b 的情况下,我可以为列c 的每对元素保留a 的多少元素同时出现

df <- unique(df[,c(1,3)])
df <- merge(df, df, by = "a")
df$count <- 1

df <- aggregate(count ~ ., df[, c(2:4)], sum)
df <- df[df$c.x != df$c.y,]

加上b不匹配的附加条件,只有一个区别:c列的元素2和4同时出现在a列的元素4上,但具有相同的值在b 中,因此不应计入:

c.x <- c(2,3,4,1,3,1,2,1)
c.y <- c(1,1,1,2,2,3,3,4)
count <- c(4,3,1,4,3,3,3,1)

result <- as.data.frame(cbind(c.x,c.y,count))

由于原始数据集很大(> 1,000,000 次观察),我欢迎快速解决方案,即不使用循环或合并。通常,我使用sparseMatrix()从三列数据帧创建共现矩阵

【问题讨论】:

  • 你能显示你的预期输出吗?你需要crossprod(table(df[c(1, 3)]))
  • 请详细说明您想要什么。照原样,您的问题有点令人困惑
  • 感谢您的评论。我添加了所需的输出。

标签: r merge conditional-statements cross-join


【解决方案1】:

从您的描述中我不确定这是否是您的想法,也不确定结果会多快,但这是purrr 的一种方法:

library(purrr)

split(df, c) %>%
  combn(2, simplify = F) %>%
  set_names(map(., ~ paste(names(.x), collapse = "_"))) %>%
  map_int(~ merge(.x[[1]], .x[[2]], by = NULL) %>%
            dplyr::filter(a.x == a.y && b.x != b.y) %>%
            nrow())

返回:

1_2 1_3 1_4 2_3 2_4 3_4 
  0  27   0  21   0   0 
# Data used:
df <- structure(list(a = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4), b = c(1, 1, 2, 2, 2, 1, 1, 2, 2, 3, 3, 3, 3, 1, 1, 1, 2, 2, 2, 4), c = c(1, 2, 1, 2, 3, 2, 3, 1, 2, 1, 1, 2, 3, 1, 2, 1, 1, 2, 4, 1)), class = "data.frame", row.names = c(NA, -20L))

【讨论】:

    猜你喜欢
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 2021-11-23
    • 2021-12-30
    相关资源
    最近更新 更多