R语言pivot_wider转换数据后如何新增对应Count最大值的ID_B新列
实现代码
# 加载所需依赖包 library(tidyverse) # 原始数据构造代码 a <- c("ID_A", "ID_B", "Count") b <- c("1", "1015", "19389") c <- c("1", "1019", "206") d <- c("1", "1027", "1210") e <- c("2", "1019", "206") f <- c("2", "1027", "1210") df <- data.frame(a, b, c, d, e, f) # 第一步:转换为ID_A、ID_B、Count三列的标准结构化表 df_clean <- df %>% # 把除第一列外的所有观测列转成长格式 pivot_longer(cols = -a, names_to = "tmp_col", values_to = "tmp_val") %>% # 将第一行存储的字段名转为正式列名 pivot_wider(names_from = a, values_from = tmp_val) %>% # 移除临时生成的列名标识列 select(-tmp_col) %>% # 将Count从字符型转为数值型方便计算 mutate(Count = as.numeric(Count)) # 第二步:按ID_A分组,生成最大值对应的ID_B新列 df_result <- df_clean %>% group_by(ID_A) %>% # which.max返回分组内Count最大值的行位置,直接索引对应ID_B即可 mutate(`ID_B of max value` = ID_B[which.max(Count)]) %>% ungroup() # 若需要匹配你示例中new_df的行存字段格式,可执行以下转换 new_df <- df_result %>% t() %>% as.data.frame() %>% rownames_to_column("tmp") %>% setNames(c("a", "b", "c", "d", "e", "f"))
关键说明
- 原始数据是字段名存于第一列、每列对应一条观测的特殊结构,需要先做两次长宽转换才能得到标准分析用表,无法直接用pivot_wider一步完成转换
- 日常分析使用
df_result即可(每行一条观测的结构更方便后续计算),最后一步的转置仅为匹配你给出的new_df构造格式
内容的提问来源于stack exchange,提问作者dreamR
相关产品推荐
相关产品推荐

