如何在 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} 和管道运算符 %>%
以提高易读性:
- 将响应存储为数据帧
df
url <- 'https://neurosynth.org/api/locations/-58_-22_6_6/compare/'
df <- jsonlite::fromJSON(url) %>% as.data.frame
- 重塑和聚合
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))
我正在分析一些 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} 和管道运算符 %>%
以提高易读性:
- 将响应存储为数据帧
df
url <- 'https://neurosynth.org/api/locations/-58_-22_6_6/compare/'
df <- jsonlite::fromJSON(url) %>% as.data.frame
- 重塑和聚合
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))