【问题标题】:using spread() within map()在 map() 中使用 spread()
【发布时间】:2020-06-21 10:44:36
【问题描述】:

我正在努力在 map() 函数中使用 spread()。这是一个示例数据:

data1 <- tibble(size = c("1", "2", "3", "4"),
               color = c("blue", "green", "yellow", "black"))

data2 <- tibble(size = c("7", "3", "10", "1"),
                color = c("orange", "yellow", "red", "white"))

dataList <- list(data1, data2)

我想用我的列表实现的目标与使用单个 tibble 的目标类似:

spread(data1, size, color)

# A tibble: 1 x 4
  `1`   `2`   `3`    `4`  
  <chr> <chr> <chr>  <chr>
1 blue  green yellow black

但我想以某种方式将这个 spread() 应用到我列表的两个小标题上,使用 map()。但我找不到正确的方法来做到这一点......知道吗?非常感谢你的帮助!

【问题讨论】:

  • map(dataList, ~ spread(., size, color)) 维护列表中的展开框架,这是您要找的吗? (或 tidyr 中的较新变体:map(dataList, ~ pivot_wider(., names_from = "size", values_from = "color"))。)
  • 您熟悉使用purrr 函数吗?如果您的重塑工作如您所愿,您应该能够将您已经获得的内容包装在函数/公式符号中。您想要的输出是什么:重塑的数据框列表,还是来自重塑各个数据框的单个数据框?
  • 是的,我想要的输出是一个重构数据的列表!

标签: r tidyr purrr


【解决方案1】:

使用tidyr::pivot_wider,因为tidyr::spread 已贬值:

data1 <- tibble::tibble(size = c("1", "2", "3", "4"),
        color = c("blue", "green", "yellow", "black"))

data2 <- tibble::tibble(size = c("7", "3", "10", "1"),
        color = c("orange", "yellow", "red", "white"))

dataList <- list(data1, data2)

purrr::map(.x = dataList, .f = ~tidyr::pivot_wider(.x, names_from = size, values_from = color) )
#> [[1]]
#> # A tibble: 1 x 4
#>   `1`   `2`   `3`    `4`  
#>   <chr> <chr> <chr>  <chr>
#> 1 blue  green yellow black
#> 
#> [[2]]
#> # A tibble: 1 x 4
#>   `7`    `3`    `10`  `1`  
#>   <chr>  <chr>  <chr> <chr>
#> 1 orange yellow red   white

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多