【问题标题】:How to extract column headers (variables names) of data frames and store them as variable in a different data frame?如何提取数据框的列标题(变量名称)并将它们作为变量存储在不同的数据框中?
【发布时间】:2019-08-23 15:30:39
【问题描述】:

我有三个具有不同列数和观察值的数据框。我想创建一个新的数据框,列出每个数据框中的所有不同变量并指定文件名。

我有三个数据框:

library(tibble)
library(magrittr)

a<-tibble(
 z=c(1,2,3),
 y=c(4,5,6),

)

b<-tibble(
  n=c(1,2),
  q=c(4,5),
  r=c(3,6),
)

c<-tibble(
  l=c(1,2),
  e=c(4,5),
  d=c(3,6),
)

我可以轻松提取一个数据框的列名,并指定它来自哪个文件。

df<-as.data.frame(names(a))%>%
  dplyr::mutate(sheet=deparse(substitute(a)))

如何在多个数据帧上迭代并保存一个数据帧,如下所示:

df<-tibble::tibble(
  name=c("z", "y", "n", "q", "r", "l", "e", "d"),
  sheet=c("a", "a","b", "b", "b", "c", "c", "c")
)

head(df)
#> # A tibble: 6 x 2
#>  name  sheet
#>   z     a    
#>   y     a    
#>   n     b    
#>   q     b    
#>   r     b    
#>   l     c

我想用 purrr 来做这件事,但我仍处于学习阶段。任何帮助将不胜感激!

【问题讨论】:

    标签: r dataframe purrr


    【解决方案1】:

    一个选项是将其放在list 中,将namesenframe 提取到两列data.frameunnest 'value' 列

    library(tidyverse)
    lst(a, b, c) %>% 
        map(names) %>%
        enframe %>% 
        unnest
    

    如果我们还需要class

    lst(a, b, c) %>%
           map_dfr(~ tibble(name = names(.x), Class = map_chr(.x, class)), 
              .id = 'grp') 
    

    base R

    stack(lapply(mget(c('a', 'b', 'c')), names))[2:1]
    

    【讨论】:

    • 谢谢@akrun!有效。只有一个后续问题:是否可以将变量的类作为附加列包含在内?
    • @brin 是字符串列还是list
    • @brin 试试lst(a, b, c) %&gt;% map_dfr(~ tibble(name = names(.x), Class = map_chr(.x, class)), .id = 'grp')
    • 谢谢!这行得通。我非常感谢您的快速响应。
    【解决方案2】:

    如果您将所有对象都放在一个列表中会容易得多,但这里有一个函数可以获取变量列表并返回您所追求的列表

    get_cols <- function(...) {
      vars <- rlang::enquos(...)
      purrr::map_dfr(vars, ~tibble(sheet=rlang::as_name(.x), name=names(rlang::eval_tidy(.x))))
    
    }
    
    get_cols(a, b, c)
    # A tibble: 8 x 2
    #   sheet name 
    #   <chr> <chr>
    # 1 a     z    
    # 2 a     y    
    # 3 b     n    
    # 4 b     q    
    # 5 b     r    
    # 6 c     l    
    # 7 c     e    
    # 8 c     d 
    

    【讨论】:

    • 出现以下错误:tibble 中的所有列都必须是 1d 或 2d 对象:* Column name 为 NULL 调用 rlang::last_error() 以查看回溯
    • @brin 我刚刚在一个新的 R 会话中进行了测试,它对我有用。我有rlang_0.3.1purrr_0.3.0。你有可能有这些包的不同版本吗?
    • 感谢您的帮助!!我有这两个软件包的最新版本。不知道为什么它不工作。上面的解决方案有效,所以继续吧!
    猜你喜欢
    • 2021-10-10
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    相关资源
    最近更新 更多