R 语言:如何将每个公司过去 5 年的所有专利分类号合并成一个观测值?

今天有个小伙伴问了这样的一个问题:

R 语言中如何将每个公司过去 5 年的所有专利分类号合并成一个观测值?例如某个公司在 2010~2020 年间每年申请了一些专利,想得到一个这样的结果,例如 2020 年的结果是把 2015~2019 年的专利集合起来;2012 年的结果是把 2010~2011 年的专利集合起来。

下面是一个示例数据:

library(tidyverse)
haven::read_dta("data.dta") -> df

df

#> # A tibble: 28 × 3
#> stkcd 申请年 被引证专利
#> <chr> <dbl> <chr>
#> 1 000001 2010 CN106780011A;CN107798595A;CN107808340A
#> 2 000001 2012 CN105741102A
#> 3 000001 2013 CN103875211A;CN103875211B;CN103875211B;CN104935549A;CN10629618…
#> 4 000001 2013 CN105741439A;CN106228351A;CN107305660A;CN107305660B;CN10739321…
#> 5 000001 2015 CN106228351A
#> 6 000001 2016 CN109302481A;CN109615423A;CN109615423B
#> 7 000001 2016 CN109302481A
#> 8 000001 2017 CN108256843A;CN108615184A;CN109636369A;WO2019184571A1
#> 9 000001 2017 CN107578237A;CN107798417A;CN107886328A;WO2019056789A1;WO201910…
#> 10 000001 2018 CN104680361A
#> # ℹ 18 more rows

例如 2016 年 000001 公司:

df %>%
filter(stkcd == "000001", between(申请年, 2016 - 5, 2015)) %>%
select(-申请年) %>%
nest(data = -c(stkcd)) -> nestdf

nestdf$data %>%
unlist() %>%
paste0(collapse = ";")

#> [1] "CN105741102A;CN103875211A;CN103875211B;CN103875211B;CN104935549A;CN106296186A;CN106296186B;CN107977564A;CN107977564B;CN105741439A;CN106228351A;CN107305660A;CN107305660B;CN107393213A;CN107609869A;TWI673662B;WO2014187400A1;CN106228351A"

然后我们就可以循环所有公司的所有年份了:

# 创建交叉数据集
unique(df$stkcd) %>%
crossing(df$申请年) %>%
set_names("stkcd", "申请年") -> crossdf

crossdf

#> # A tibble: 18 × 2
#> stkcd 申请年
#> <chr> <dbl>
#> 1 000001 2010
#> 2 000001 2012
#> 3 000001 2013
#> 4 000001 2015
#> 5 000001 2016
#> 6 000001 2017
#> 7 000001 2018
#> 8 000001 2019
#> 9 000001 2020
#> 10 000002 2010
#> 11 000002 2012
#> 12 000002 2013
#> 13 000002 2015
#> 14 000002 2016
#> 15 000002 2017
#> 16 000002 2018
#> 17 000002 2019
#> 18 000002 2020

# 编写函数处理每个公司每年的结果
crossdf %>%
mutate(被引证专利集合 = map2_chr(stkcd, 申请年, function(x, y){
df %>%
filter(stkcd == x, between(申请年, y - 5, y - 1)) %>%
select(-申请年) %>%
nest(data = -c(stkcd)) -> nestdf

nestdf$data %>%
unlist() %>%
paste0(collapse = ";")
})) -> crossdf

crossdf

#> # A tibble: 18 × 3
#> stkcd 申请年 被引证专利集合
#> <chr> <dbl> <chr>
#> 1 000001 2010 ""
#> 2 000001 2012 "CN106780011A;CN107798595A;CN107808340A"
#> 3 000001 2013 "CN106780011A;CN107798595A;CN107808340A;CN105741102A"
#> 4 000001 2015 "CN106780011A;CN107798595A;CN107808340A;CN105741102A;CN1038752…
#> 5 000001 2016 "CN105741102A;CN103875211A;CN103875211B;CN103875211B;CN1049355…
#> 6 000001 2017 "CN105741102A;CN103875211A;CN103875211B;CN103875211B;CN1049355…
#> 7 000001 2018 "CN103875211A;CN103875211B;CN103875211B;CN104935549A;CN1062961…
#> 8 000001 2019 "CN106228351A;CN109302481A;CN109615423A;CN109615423B;CN1093024…
#> 9 000001 2020 "CN106228351A;CN109302481A;CN109615423A;CN109615423B;CN1093024…
#> 10 000002 2010 ""
#> 11 000002 2012 "CN106780011A;CN107798595A;CN107808340A"
#> 12 000002 2013 "CN106780011A;CN107798595A;CN107808340A;CN105741102A"
#> 13 000002 2015 "CN106780011A;CN107798595A;CN107808340A;CN105741102A;CN1038752…
#> 14 000002 2016 "CN105741102A;CN103875211A;CN103875211B;CN103875211B;CN1049355…
#> 15 000002 2017 "CN105741102A;CN103875211A;CN103875211B;CN103875211B;CN1049355…
#> 16 000002 2018 "CN103875211A;CN103875211B;CN103875211B;CN104935549A;CN1062961…
#> 17 000002 2019 "CN106228351A;CN109302481A;CN109615423A;CN109615423B;CN1093024…
#> 18 000002 2020 "CN106228351A;CN109302481A;CN109615423A;CN109615423B;CN1093024…

这样就解决了这个问题。

点击这里跳转到 RStata 短书平台获取附件:R 语言:如何将每个公司过去 5 年的所有专利分类号合并成一个观测值?

评论