r - 如何计算任意两个给定值在 R 中连续出现的次数?
问题描述
我正在使用这样的数据框,该ID
列指示特定出版物:
ID AuthorA AuthorB AuthorC
1 Chris Lee Jill
2 Jill Tom Lee
3 Tom Chris Lee
4 Lee Jill NA
5 Jill Chris NA
我想为社交网络分析生成一个source
、target
和count
列。换句话说,计算两位作者出现在同一出版物上的次数。然而,我正在使用的数据框有 18 个作者列。这应该是最终输出:
Source Target Count
Chris Lee 2
Chris Jill 2
Lee Jill 3
Jill Tom 1
Tom Lee 2
Tom Chris 1
解决方案
对于每一行,您都可以创建名称的所有组合并使用 计算它们的频率table
。
result <- stack(table(unlist(apply(df[-1], 1, function(x) {
vec <- na.omit(x)
if(length(vec) < 2) return(NULL)
combn(vec, 2, function(y) paste0(sort(y), collapse = '-'))
}))))[2:1]
result
# ind values
#1 Chris-Jill 2
#2 Chris-Lee 2
#3 Chris-Tom 1
#4 Jill-Lee 3
#5 Jill-Tom 1
#6 Lee-Tom 2
要将它们放在单独的列中,您可以使用separate
:
tidyr::separate(result, ind, c('Source', 'Target'), sep = '-')
# Source Target values
#2 Chris Jill 2
#3 Chris Lee 2
#4 Chris Tom 1
#6 Jill Lee 3
#7 Jill Tom 1
#9 Lee Tom 2
推荐阅读
- python - 在什么情况下操作系统会知道 Python 创建的线程?
- javascript - Firebase 查询快照为时间戳字段返回 null 而不是任何值
- javascript - 如何在 react/javascript 中通过首字母过滤对象数组
- javascript - 编辑用 JQuery 加载的 HTML
- r - 将来自不同数据集的多条回归线的图例添加到 ggplot
- javascript - ExpressJs req.body 显示未定义
- python - 我想知道如何制作合并功能
- html - 为什么我在引导程序中的断点不是好的网格不工作
- scala - 如何在 scala sbt 中设置编码?
- python - 当一个字母可以是任何东西时,找出子字符串出现的多次