R语言如何为数据框新增列统计指定列各值的累计出现序号
R数据框生成累计出现序号并转宽表的最优实现
最优方案(tidyverse生态)
该方案代码简洁、可读性强,支持链式调用直接完成全流程需求,无需生成中间表:
library(tidyverse) # 输入数据 my_df1 <- data.frame(col1 = c("A","D","B","E","A","G","G","E","G"), col2 = c(1, 3, 5, 4, 3, 1, 1, 5, 5)) # 一步完成生成序号+宽表转换 my_df_wide <- my_df1 %>% group_by(col1) %>% mutate(col3 = row_number()) %>% ungroup() %>% pivot_wider( names_from = col3, names_prefix = "occurrence_", values_from = col2 )
代码逻辑说明:
group_by(col1)按照指定列分组,用于统计每个值的出现次数row_number()会为每个分组内的行按原始数据的顺序生成从1开始的递增序号,完全符合要求的累计出现次数规则,和SQL中的row_number窗口函数逻辑完全一致- 链式调用
pivot_wider直接完成宽表转换,无需单独保存中间的my_df2表
如果需要单独保留带序号的中间表,只需要提前赋值即可:
my_df2 <- my_df1 %>% group_by(col1) %>% mutate(col3 = row_number()) %>% ungroup()
可选base R实现
如果不想加载第三方包,可以用base R的ave函数完成新增序号列的需求:
my_df1$col3 <- ave(seq(nrow(my_df1)), my_df1$col1, FUN = seq_along) # 后续再调用tidyr的pivot_wider即可完成宽表转换
*注:示例宽表结果中出现的C行属于输入笔误,提供的原始输入数据中不存在C值,实际运行代码不会出现该行。
内容的提问来源于stack exchange,提问作者cstrudels
相关产品推荐
相关产品推荐

