如何在 R 的字符向量中找到最常见的单词?

How do I find the most common words in a character vector in R?

我正在分析一些 fmri 数据——特别是,我正在研究哪些认知功能与来自 fmri 扫描的坐标相关联(在受试者执行任务时进行。我的数据可以通过以下函数获得:

library(httr)
scrape_and_sort = function(neurosynth_link){
  result = content(GET(neurosynth_link), "parsed")$data
  names  = c("Name", "z_score", "post_prob", "func_con", "meta_analytic")
  df = do.call(rbind, lapply(result, function(x) setNames(as.data.frame(x), names)))
  df$z_score = as.numeric(df$z_score)
  df = df[order(-df$z_score), ]
  df = df[-which(df$z_score<3),]
  df = na.omit(df)
  return(df)
}
 RO4 = scrape_and_sort('https://neurosynth.org/api/locations/-58_-22_6_6/compare')

现在,我想知道哪些关键词最常出现,最好构建一个最常用词的列表。我尝试了以下方法:

sort(table(RO4$Name),decreasing=TRUE)

但这显然不会 work.The 问题是名称(例如:“auditory cortex”)是包含多个单词的字符串,所以结果如 'auditory' 和 'auditory cortex' 作为两个单独的条目出现,而我希望将它们算作 'auditory'.

的两个实例

但我不确定如何在每个字符串中搜索并记录这样的单个单词。有什么想法吗?

不太懂。你不能这样继续吗:

x <- c("auditory cortex", "auditory", "auditory", "hello friend")
unlist(strsplit(x, " "))
# "auditory" "cortex"   "auditory" "auditory" "hello"    "friend"

使用软件包 {jsonlite}、{dplyr} 和管道运算符 %>% 以提高易读性:

  1. 将响应存储为数据帧 df
url <- 'https://neurosynth.org/api/locations/-58_-22_6_6/compare/'
df <- jsonlite::fromJSON(url) %>% as.data.frame
  1. 重塑和聚合
df %>%
    ## keep first column only and name it 'keywords':
    select('keywords' = 1) %>%
    ## multiple cell values (as separated by a blank)
    ## into separate rows:
    separate_rows(keywords, sep = " ") %>%
    group_by(keywords) %>%
    summarise(count = n()) %>%
    arrange(desc(count))

结果:

+ # A tibble: 965 x 2
   keywords count
   <chr>    <int>
 1 cortex      53
 2 gyrus       26
 3 temporal    26
 4 parietal    23
 5 task        22
 6 anterior    19
 7 frontal     18
 8 visual      17
 9 memory      16
10 motor       16
# ... with 955 more rows

编辑:或者,如果你想从你的数据框

RO4 %>%
    select(Name) %>%
    ## select(everything())
    ## select(Name:func_con)
    separate_rows(Name, sep=' ') %>%
    ## do remaining stuff

您当然可以通过多种方便的方式 select 更多列(请参阅上面的注释行和 ?dplyr::select)。请注意,其他变量的值将重复多次,因为需要行来容纳“名称”列中的任何多值,因此这会引入一些冗余。

如果你想采用 {dplyr} 风格,按 z-score 降序排列并排除不需要的 z-scores 将如下所示:

RO4 %>%
    filter(z_score < 3 & !is.na(z_score)) %>%
    arrange(desc(z_score))