【问题标题】:Pivot wider a column containing lists将包含列表的列旋转得更宽
【发布时间】:2022-07-06 23:16:56
【问题描述】:

我有这个数据集:

col1   col2
 a    c(1,2)
 b       5

我想要这个数据集:

col1    col2_1  col2_2   col2_5
 a       TRUE    TRUE    FALSE
 b      FALSE   FALSE    TRUE

我知道我必须使用更宽的枢轴。但我不知道怎么做!你能帮忙吗?

【问题讨论】:

  • 请通过dput(data)提供可重现的数据。

标签: r pivot


【解决方案1】:

您可以取消嵌套 col2,然后将数据整形为宽。

library(tidyr)

df %>%
  unnest(col2) %>%
  pivot_wider(col1, names_from = col2, names_prefix = "col2_",
              values_from = col2, values_fn = Negate(is.na), values_fill = FALSE)

# # A tibble: 2 × 4
#   col1  col2_1 col2_2 col2_5
#   <chr> <lgl>  <lgl>  <lgl> 
# 1 a     TRUE   TRUE   FALSE 
# 2 b     FALSE  FALSE  TRUE 

数据
df <- data.frame(col1 = c('a', 'b'))
df$col2 <- list(1:2, 5)

#   col1 col2
# 1    a 1, 2
# 2    b    5

【讨论】:

    【解决方案2】:

    使用tabulate 给出:

    t(sapply(dat$col2, tabulate, max(unlist(dat$col2))))
    #      [,1] [,2] [,3] [,4] [,5]
    # [1,]    1    1    0    0    0
    # [2,]    0    0    0    0    1
    

    所以我们可以这样做

    dat[1] |>
      cbind(t(sapply(dat$col2, \(x) as.logical(tabulate(x, max(unlist(dat$col2)))))) |>
      `colnames<-`(paste(names(dat)[-1], seq_len(max(unlist(dat$col2))), sep='_')))
    #   col1 col2_1 col2_2 col2_3 col2_4 col2_5
    # 1    a   TRUE   TRUE  FALSE  FALSE  FALSE
    # 2    b  FALSE  FALSE  FALSE  FALSE   TRUE
    

    --

    数据:

    dat <- list2DF(list(c('a', 'b'), list(c(1, 2), 5))) |> setNames(paste0('col', 1:2))
    

    【讨论】:

      猜你喜欢
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      • 2021-05-08
      • 2019-07-26
      • 2022-10-23
      • 2021-12-23
      • 2019-04-14
      • 2022-01-25
      相关资源
      最近更新 更多