查看原文
其他

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

RStata RStata 2023-10-24

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

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 - 52015)) %>% 
  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


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存