R语言统计bars_by_foo字段文本频次并生成my.column列的方法
实现方案
方法1:纯基础R实现
在你现有代码的基础上,新增频次统计逻辑即可,完整可运行代码如下:
# 你原有预处理代码 data <- data.frame(foo=c(1, 1, 1, 2, 2, 3, 3, 3), bar=c('a', 'a', 'b', 'a', 'b', 'b', 'c', 'd')) agg <- aggregate(bar~foo, data = data, paste0, collapse="") df <- merge(data, agg, by = "foo", all = T) colnames(df) <- c(colnames(data), "bars_by_foo") # 新增my.column字段的逻辑 freq_stats <- tapply(data$bar, data$foo, function(x) { count_tb <- table(x) paste0(names(count_tb), "(", count_tb, ")", collapse = ", ") }) freq_df <- data.frame(foo = as.integer(names(freq_stats)), my.column = freq_stats, row.names = NULL) df <- merge(df, freq_df, by = "foo", all.x = TRUE) # 查看结果 df
方法2:dplyr 实现(更简洁)
如果你习惯用tidyverse套件,分组后直接批量生成所需字段即可:
library(dplyr) data <- data.frame(foo=c(1, 1, 1, 2, 2, 3, 3, 3), bar=c('a', 'a', 'b', 'a', 'b', 'b', 'c', 'd')) df <- data %>% group_by(foo) %>% mutate( bars_by_foo = paste0(bar, collapse = ""), my.column = { count_tb <- table(bar) paste0(names(count_tb), "(", count_tb, ")", collapse = ", ") } ) %>% ungroup() # 查看结果 df
两种方法运行后输出结果和你给出的预期格式完全一致。
内容的提问来源于stack exchange,提问作者symkly
相关产品推荐
相关产品推荐

