首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查找以逗号分隔的字符串出现的次数,并输出该字符串。

查找以逗号分隔的字符串出现的次数,并输出该字符串。
EN

Stack Overflow用户
提问于 2017-04-07 02:01:54
回答 1查看 79关注 0票数 0

我正在执行一个实体消歧项目,我有一个同名作者的数据,并有以下列:author IDcoauthor names

我需要找到由作者ID标识的作者与他/她曾经合作过的所有合作者之间的数字协作。

下面是数据文件的一个示例:

代码语言:javascript
运行
复制
author.ID             coauthor.names
   1                  J Smith, A Greer
   1                  J Adams, J Smith
   2                  D Richardson, J Smith

我想要的输出是:

代码语言:javascript
运行
复制
author.ID     coauthor.name     collaboration.times
   1             J Smith                2
   1             J Adams                1
   1             A Greer                1
   2             D Richardson           1
   2             J Smith                1

我尝试过将所有的合著者(用逗号分隔)和一个特定的author ID组合成一个大字符串,我将在这个巨大的字符串上使用来自stringr包的stringr包,但是我不知道我是否在解决这个问题的正确道路上。

是否有更有效或更优雅的方法来解决这个问题?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-07 04:17:57

假设你在处理这样的数据:

代码语言:javascript
运行
复制
mydf <- structure(list(author.ID = c(1L, 1L, 2L), coauthor.names = c("J Smith, A Greer", 
    "J Adams, J Smith", "D Richardson, J Smith")), .Names = c("author.ID", 
    "coauthor.names"), row.names = c(NA, 3L), class = "data.frame")
mydf
##   author.ID        coauthor.names
## 1         1      J Smith, A Greer
## 2         1      J Adams, J Smith
## 3         2 D Richardson, J Smith

..。您可以从我的"splitstackshape“包中尝试cSplit,然后使用”data.table“中的.N进行聚合:

代码语言:javascript
运行
复制
library(splitstackshape)
cSplit(mydf, "coauthor.names", ",", "long")[
  , list(collaboaration.times = .N), .(author.ID, coauthor.names)][]
#    author.ID coauthor.names collaboaration.times
# 1:         1        J Smith                    2
# 2:         1        A Greer                    1
# 3:         1        J Adams                    1
# 4:         2   D Richardson                    1
# 5:         2        J Smith                    1

假设你在处理这样的数据:

代码语言:javascript
运行
复制
mydf2 <- structure(list(author.ID = c(1L, 1L, 2L), coauthor.names = structure(list(
        c("J Smith", "A Greer"), c("J Adams", "J Smith"), c("D Richardson", 
        "J Smith")), class = "AsIs")), .Names = c("author.ID", "coauthor.names"
    ), row.names = c(NA, 3L), class = "data.frame")
mydf2
##   author.ID coauthor.names
## 1         1   J Smith,....
## 2         1   J Adams,....
## 3         2   D Richar....

..。您可以从listCol_l开始(同样从“splitstackshape”开始),然后以相同的方式计数。

代码语言:javascript
运行
复制
listCol_l(mydf2, "coauthor.names")[
  , list(collaboration.times = .N), .(author.ID, coauthor.names_ul)]
#    author.ID coauthor.names_ul collaboration.times
# 1:         1           J Smith                   2
# 2:         1           A Greer                   1
# 3:         1           J Adams                   1
# 4:         2      D Richardson                   1
# 5:         2           J Smith                   1

"tidyverse“等价物可能如下所示:

代码语言:javascript
运行
复制
library(tidyverse)
# For a single character string as "coauthor.names"
mydf %>% 
  mutate(coauthor.names = lapply(strsplit(coauthor.names, ","), trimws)) %>%
  unnest() %>% 
  group_by(author.ID, coauthor.names) %>% 
  summarise(collaboration.times = n())

# If "coauthor.names" is already a `list`.
mydf2 %>%
  unnest() %>%
  group_by(author.ID, coauthor.names) %>%
  summarise(collaboration.times = n())
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43268482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档