tidyr::pivot_wider处理重复值:新增行不重复其他列值及优化
问题描述
初始需求与问题
我需要用pivot_wider转换数据集,要求把重复值放到单独行里,而非以列表形式展示。尝试了以下代码后,重复值虽移至新行,但该行其他值也被重复了。
示例数据与代码
df = data.frame(variables = c('a', 'b', 'c', 'c'), values = c(1, 2, 3, 4), dates = c(6, 6, 6, 6)) df_wide <- df %>% pivot_wider(names_from = variables, values_from = values, values_fill = NA, values_fn = list) %>% unnest()
当前结果
# A tibble: 2 × 4 dates a b c <dbl> <dbl> <dbl> <dbl> 1 6 1 2 3 2 6 1 2 4
期望结果
# A tibble: 2 × 4 dates a b c <dbl> <dbl> <dbl> <dbl> 1 6 1 2 3 2 NA NA NA 4
更新:复杂数据集的剩余问题
借助现有方案后已接近需求,但仍存在问题。以下是更复杂的数据集及当前处理情况:
数据集与所用代码
df <- data.frame(RK = c(1,1,1,1, 1,1,1,1, 1,2,2,2, 1,2,2,3, 3,3,3,3, 3,3,3,4, 4,4,5,5, 6,6,6,6, 7,7,7,7), Name = paste0("Name", seq(1:36)), Position = rep(paste("POS", seq(1:4)),9)) # 所用代码 df %>% mutate(cnt = row_number(), .by = Position) %>% pivot_wider(names_from = Position, values_from = Name) %>% select(-cnt) %>% arrange(RK)
当前结果
# A tibble: 14 × 5 RK `POS 1` `POS 2` `POS 3` `POS 4` <dbl> <chr> <chr> <chr> <chr> 1 1 Name1 Name2 Name3 Name4 2 1 Name5 Name6 Name7 Name8 3 1 Name9 NA NA NA 4 1 Name13 NA NA NA 5 2 NA Name10 Name11 Name12 6 2 NA Name14 Name15 NA 7 3 NA NA NA Name16 8 3 Name17 Name18 Name19 Name20 9 3 Name21 Name22 Name23 NA 10 4 NA NA NA Name24 11 4 Name25 Name26 NA NA 12 5 NA NA Name27 Name28 13 6 Name29 Name30 Name31 Name32 14 7 Name33 Name34 Name35 Name36
剩余需求
对于RK == 3的行,希望调整结果:让RK ==3的第一行包含所有名称,NA值置于名称之后,这样RK ==3只需2行而非3行;同时RK ==4只需1行。
内容的提问来源于stack exchange,提问作者melmo
相关产品推荐
相关产品推荐

