【问题标题】:How to modify column types in nested data frames using purrr and tidyr如何使用 purrr 和 tidyr 修改嵌套数据框中的列类型
【发布时间】:2019-01-24 16:50:40
【问题描述】:

我正在将许多源文件中的数据读取到嵌套数据框中。某些列的数据类型不兼容,这会阻止 tidyr::unnest() 函数工作。

例如这里是一个基于iris数据集的嵌套数据框:

irisnested <- iris %>% 
    rename_all(tolower) %>% 
    group_by(species) %>% 
    nest()

为了重现我的问题,我在嵌套数据框的data 列表列中更改了其中一个子数据框中的列类型:

irisnested$data[[2]]$sepal.length <- as.character(irisnested$data[[2]]$sepal.length)

现在数据框不能再取消嵌套了:

irisnested %>% 
    unnest(data)
# Error in bind_rows_(x, .id) : Column `sepal.length` can't be converted from numeric to character

为了更正每个嵌套数据框中的列类型,我使用了一个匿名函数:

irisnested %>% 
    mutate(data = map(data,
                      function(dtf){
                          dtf$sepal.length = as.numeric(dtf$sepal.length)
                          return(dtf)
                      })) %>% 
    unnest(data)

现在可以再次取消嵌套数据框。但是这个匿名函数看起来很复杂,我直觉肯定有另一种方法可以做到。是否有更好的方法来执行此修改,例如使用modify_at

【问题讨论】:

    标签: r tidyverse tidyr purrr


    【解决方案1】:

    我们可以使用~,获取数据为.x,然后使用mutate更改感兴趣列的类型

    irisnested %>% 
       mutate(data = map(data, ~ 
                           .x %>% 
                             mutate(sepal.length = as.numeric(sepal.length))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      相关资源
      最近更新 更多