【发布时间】: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