其他
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 平台上下载。
是不是感觉很硬核!欢迎报名 RStata 培训班获取全部课程和以会员价获取数据资料(10元/份)详情可阅读这篇推文:数据处理、图表绘制、效率分析与计量经济学如何学习~
详情可点击阅读原文进入 RStata 学院了解(从首页的会员卡专区即可查看和购买会员卡)。
更多关于 RStata 培训班的信息可添加微信号 r_stata 咨询:
附件下载链接(点击文末的阅读原文即可跳转):
https://rstata.duanshu.com/#/brief/course/cf21be85d60b476ea1011ff589ce2972