如何在R语言中提取数据框每行字符串的最常见单词?
按行提取R语言数据框字符串中最频繁元素的解决方案
首先给出原始数据框:
df <- data.frame(A = c("a, a, a, b, b, c, c", "a, a, b, b, b, b, c", "a, a, b, b"), B = c(3, 5, 8))
需求是:为变量A的每个观测值,提取以逗号分隔的字符串中出现频率最高的单词;若多个单词频率相同,需同时提取并用逗号分隔。
之前的代码错误地对整列所有元素统计频率,得到的是整列最常见的单词,无法按行处理,错误结果如下:
wrong_result <- data.frame(A = c("a, a, a, b, b, c, c", "a, a, b, b, b, b, c"), B = c(3, 5, 8), C = c("b", "b", "b"))
解决方案
方法1:基础R实现
定义一个处理单个字符串的函数,再用sapply按行应用:
# 定义函数:提取单个字符串中频率最高的元素(含并列情况) get_most_freq <- function(s) { elements <- strsplit(s, ", ")[[1]] freq_table <- table(elements) max_freq <- max(freq_table) paste(names(freq_table[freq_table == max_freq]), collapse = ", ") } # 生成新列C df$C <- sapply(df$A, get_most_freq)
方法2:tidyverse风格实现
如果习惯使用dplyr和purrr,可以用以下代码:
library(dplyr) library(purrr) df <- df %>% mutate(C = map_chr(A, function(s) { elements <- str_split(s, ", ")[[1]] freq_table <- table(elements) max_freq <- max(freq_table) paste(names(freq_table[freq_table == max_freq]), collapse = ", ") }))
运行后得到的期望结果:
result <- data.frame(A = c("a, a, a, b, b, c, c", "a, a, b, b, b, b, c", "a, a, b, b"), B = c(3, 5, 8), C = c("a", "b", "a, b"))
内容的提问来源于stack exchange,提问作者Anton
相关产品推荐
相关产品推荐

