如何解决根据第二列计算一列元素之间的共现,仅在第三列不相等时才计数
我想计算数据框 c
中列 df
中唯一元素的每个成对组合在列 a
的元素上共同出现的频率,但是加上 co -occurrences 仅在列 b
中的相应值不相等时才计算,即以列 b
a <- c(1,1,2,3,4,4)
b <- c(1,4)
c <- c(1,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,1)
c.y <- c(1,4)
count <- c(4,1)
result <- as.data.frame(cbind(c.x,c.y,count))
由于原始数据集很大(> 1,000,000 个观察值),我欢迎快速解决方案,即不使用循环或合并。通常,我使用 sparseMatrix()
解决方法
根据您的描述,我不确定这是否是您的想法,也不知道结果会有多快,但这里有一种使用 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,2,3,4,4),b = c(1,c = c(1,1)),class = "data.frame",row.names = c(NA,-20L))
,
我们可以使用
crossprod(table(df[c(1,3)]))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。