我有一个大约90个不同的csv文件的大数据集,以这种格式构建(每个大学):
University | ArticleCode | Pages | Authors | year | Citations ...
我必须拿出这个数据集,按年汇总共同发表的文章。文章由articleecode唯一标识,因此如果两个不同的数据集在articleecode列中具有相同的代码,则意味着该文章是一起发布的。
University1 | University2 | year | number of articles in common |
如何使用R?
有更复杂的方法可以做到这一点,但对于大多数像这样的数据,我可以想象,一个简单的蛮力tidyverse
方法应该工作得很好,并且应该是直接遵循。
假设我们有大学,文章代码和年份的列表:
library(tidyverse)
set.seed(42) # included so your output will match mine
df <- tibble(
University = sample(LETTERS[1:4], size = 15, replace = TRUE),
ArticleCode = rpois(n = 15, lambda = 2),
year = 2010 + ArticleCode %% 2) # Assumes all articles have one year each,
# so if we know the article we know the year
注意,在本例中,大学A在第4条中出现了两次,分别出现在第1行和第9行。这样做的目的是为了复制数据中可能有相同大学和文章的重复列表的可能性,例如,可能有多个作者。
> df
# A tibble: 15 × 3
University ArticleCode year
<chr> <int> <dbl>
1 A 4 2010
2 A 5 2011
3 A 0 2010
4 A 2 2010
5 B 2 2010
6 D 4 2010
7 B 1 2011
8 B 6 2010
9 A 4 2010
10 D 0 2010
11 C 2 2010
12 D 1 2011
13 C 4 2010
14 D 2 2010
15 A 3 2011
假设我只想包含唯一的大学文章对,我可以创建一个修改版本的数据,删除这些重复数据,并对它们进行排列,以便于可视化查看。注意,重复的A-4行已被删除。我还在这里指定,我只关心文章、年份和大学,以便统计年度文章。如果以后需要检索任何其他列,我可以连接原始数据。
df_distinct <- df %>%
distinct(ArticleCode, year, University) %>%
arrange(ArticleCode, year, University)
> df_distinct
# A tibble: 14 × 3
University ArticleCode year
<chr> <int> <dbl>
1 A 0 2010
2 D 0 2010
3 B 1 2011
4 D 1 2011
5 A 2 2010
6 B 2 2010
7 C 2 2010
8 D 2 2010
9 A 3 2011
10 A 4 2010
11 C 4 2010
12 D 4 2010
13 A 5 2011
14 B 6 2010
有强大的网络分析工具,如igraph
,可以帮助处理更复杂的情况,但对于相对较小的数据方法应该很好。(例如,我假设每篇论文通常不会涉及数千所大学;如果有的话,那么每篇论文将创建超过一百万行,对于足够多的文章,这可能会超过内存限制。
我将数据连接到自身(基于articleecode和年份),过滤掉自匹配,并每年计算配对。
left_join(df_distinct, df_distinct, by = c("ArticleCode", "year")) %>%
filter(University.x != University.y) %>%
count(University.x, University.y, year, sort = TRUE)
输出告诉我们,2010年大学的A-D/D-A配对有最多的共同文章:我们可以从数据中看到,他们当年都在研究第0条、第2条和第4条。如果我们只想看到每对配对一次,我们可以用filter(University.x < University.y) %>%
替换过滤器,以确保我们只看到A-D而不是D-A。
# A tibble: 14 × 4
University.x University.y year n
<chr> <chr> <dbl> <int>
1 A D 2010 3
2 D A 2010 3
3 A C 2010 2
4 C A 2010 2
5 C D 2010 2
6 D C 2010 2
7 A B 2010 1
8 B A 2010 1
9 B C 2010 1
10 B D 2010 1
11 B D 2011 1
12 C B 2010 1
13 D B 2010 1
14 D B 2011 1