首页 > 解决方案 > R pivot_wider 每行保留一个 id

问题描述

我有一个包含 ID 和值的数据集,其中一个 ID 可以采用多个值。目前,当有多个值时,相同的 ID 会逐行重复,但我希望每行保留一个 ID,必要时添加更多列。这是一个可重现的示例:

df <- data.frame(id = c(1,1,1,2,3,3),
                 val = c(10:15))

我想要的是

df2 <- data.frame(id = c(1:3),
                  val1 = c(10, 13, 14),
                  val2 = c(11, "", 15), 
                  val3 = c(12, "", ""))

我尝试使用pivot_wider以下方法完成它,但它有两个问题:(1)无法弄清楚如何创建我自己的列名;(2) 想要添加列,但它在单元格中创建了一个列表。

library(tidyr)
df %>% pivot_wider(values_from = val, values_fn = list, names_prefix = "x")

标签: rtidyverse

解决方案


您需要添加一个序列列:

df %>% group_by(id) %>%
  mutate(time=row_number()) %>%
  pivot_wider(names_from=time, values_from = val, names_prefix = "val")

# A tibble: 3 x 4
# Groups:   id [3]
     id  val1  val2  val3
  <dbl> <int> <int> <int>
1     1    10    11    12
2     2    13    NA    NA
3     3    14    15    NA

library(tidyr)
library(dplyr)

推荐阅读