【问题标题】:Format a list of lists of dataframes格式化数据框列表的列表
【发布时间】:2020-02-03 06:43:37
【问题描述】:

我正在努力学习purr,因此我正在寻找与之相关的解决方案。 假设我有一个包含 3 个元素的列表,其元素本身就是数据框列表:

a1 <- data.frame(a = c('alfa', 'beta', 'omega'), b = rnorm(3,0,1), c = NA)
a2 <- data.frame(a = c('lambda', 'delta', 'epsilon'), b = rnorm(3,0, 1), c = NA)
b1 <- data.frame(a = c('lambda', 'delta', 'alfa'), b = rnorm(3, 1, 1), c = 1)
b2 <- data.frame(a = c('beta', 'delta', 'epsilon'), b = rnorm(3, 1, 2), c = c(0, 1, NA))

a <- list(a1, a2)
b <- list(b1, b2)

L <- list(a,b)

如何使用 map*_ 格式化 L 以使所有第一列都转换为字符(我不需要知道任何列都可能包含因子的一般情况)以及 NAs被删除了吗?

由于嵌套不止一层,我不知道如何在不取消嵌套的情况下调用函数。

【问题讨论】:

    标签: r list purrr


    【解决方案1】:

    dplyrpurrr 选项可以是:

    map_depth(.x = L, 2, ~ .x %>%
               mutate_at(1, as.character) %>%
               na.omit())
    
    [[1]]
    [[1]][[1]]
    [1] a b c
    <0 rows> (or 0-length row.names)
    
    [[1]][[2]]
    [1] a b c
    <0 rows> (or 0-length row.names)
    
    
    [[2]]
    [[2]][[1]]
           a         b c
    1 lambda 0.6691767 1
    2  delta 1.5106571 1
    3   alfa 1.8121246 1
    
    [[2]][[2]]
          a          b c
    1  beta -0.4429880 0
    2 delta -0.7539317 1
    

    【讨论】:

    • 我已经接受了答案,但奇怪的是R告诉我没有这个功能
    • 也许您使用的是旧版本的purrr。请尝试更新到最新的:)
    • 假设我想将除第一列之外的所有列从字符更改为数字。我已经将解决​​方案调整为 L % mutate_at(-c(1), as.numeric) %>% na.omit()) 为什么这不是在职的?到处都有NA的介绍
    • 如果您尝试将字符向量转换为数字,那么如果不包含可以转换的数字,它将无法工作。否则,map_depth(.x = L, 2, ~ .x %&gt;% mutate_at(-1, as.numeric) %&gt;% na.omit()) 应该可以工作并且正在处理您的示例数据。
    • 好的,现在我明白我的问题了。我的号码格式为print(head(L$a$a1)) = "150,27" "0,00" "0,00" "0,00" "0,00" "0,00"。也许那些无法正确转换
    【解决方案2】:

    为了完整起见,以及出于任何原因可能更喜欢坚持使用base 的未来用户,这里有一个base 解决方案,它假设所有数据帧都将具有相同的名称:

        lapply(L,lapply,function(x) na.omit(within(x,
                                       { a <-as.character(a)})))
    [[1]]
    [[1]][[1]]
    [1] a b c
    <0 rows> (or 0-length row.names)
    
    [[1]][[2]]
    [1] a b c
    <0 rows> (or 0-length row.names)
    
    
    [[2]]
    [[2]][[1]]
           a          b c
    1 lambda -0.7389969 1
    2  delta  0.9791327 1
    3   alfa  1.4097145 1
    
    [[2]][[2]]
          a          b c
    1  beta -0.3176996 0
    2 delta  2.8242954 1
    

    或者,如果数据帧的名称不同,

     lapply(L,lapply,function(x) na.omit(replace(x,1,as.character(x[,1]))))
    

    注意:这可能不如purrr 解决方案灵活,因为您无法控制索引级别(即对于purrr,您可以决定提高到一定深度)那里可能是 rapplylapply 本身的一种方式,但我不知道。

    结果的结构:

       List of 2
     $ :List of 2
      ..$ :'data.frame':    0 obs. of  3 variables:
      .. ..$ a: chr(0) 
      .. ..$ b: num(0) 
      .. ..$ c: logi(0) 
      .. ..- attr(*, "na.action")= 'omit' Named int [1:3] 1 2 3
      .. .. ..- attr(*, "names")= chr [1:3] "1" "2" "3"
      ..$ :'data.frame':    0 obs. of  3 variables:
      .. ..$ a: chr(0) 
      .. ..$ b: num(0) 
      .. ..$ c: logi(0) 
      .. ..- attr(*, "na.action")= 'omit' Named int [1:3] 1 2 3
      .. .. ..- attr(*, "names")= chr [1:3] "1" "2" "3"
     $ :List of 2
      ..$ :'data.frame':    3 obs. of  3 variables:
      .. ..$ a: chr [1:3] "lambda" "delta" "alfa"
      .. ..$ b: num [1:3] -0.739 0.979 1.41
      .. ..$ c: num [1:3] 1 1 1
      ..$ :'data.frame':    2 obs. of  3 variables:
      .. ..$ a: chr [1:2] "beta" "delta"
      .. ..$ b: num [1:2] -0.318 2.824
      .. ..$ c: num [1:2] 0 1
      .. ..- attr(*, "na.action")= 'omit' Named int 3
      .. .. ..- attr(*, "names")= chr "3"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      • 2019-05-20
      相关资源
      最近更新 更多