【问题标题】:Applying the same column names to multiple tibbles将相同的列名应用于多个小标题
【发布时间】:2019-07-03 16:10:55
【问题描述】:

我想使用names 函数将相同的列名应用于多个数据帧,所有这些数据帧都具有相同的列数。我当然可以通过为每个数据帧调用names错误 的方式做到这一点,但我想正确地做到这一点。这是设置:

library(tidyverse)

df1 <- tibble(1,2,3,4,5)
df2 <- tibble(6,7,8,9,10)
df3 <- tibble(11,12,13,14,15)
df4 <- tibble(16,17,18,19,20)

column_names <- c("Alpha","Bravo","Charlie","Delta","Echo")
tibbles_list <- (c("df1","df2","df3","df4"))

错误的方式当然是:

names(df1) <- column_names
names(df2) <- column_names
names(df3) <- column_names
names(df4) <- column_names

我想以某种方式使用tibbles_list 中的数据帧列表(通过as.namerlang::syms 或类似方法)将column_names 应用于一行代码中的所有数据帧,也许使用某些种类的代码purrrmap 或基本 R 中的 apply 函数之一,但我完全不知道如何操作。

【问题讨论】:

  • 你为什么要列出数据框的名称,而不仅仅是数据框本身?例如tibbles_list &lt;- list(df1, df2, df3, df4)
  • 嗨卡米尔——不知道。我可能做错了很多事情。

标签: r purrr


【解决方案1】:

tibbles_list 只是作为字符串的对象标识符的vector。使用mget,我们在list 中获取对象的值,使用map 遍历列表并使用rename_all 更改名称

lst1 <- map(mget(tibbles_list), ~ .x %>%
                   rename_all(~ column_names))
list2env(lst1, .GlobalEnv)

或使用set_names

map(mget(tibbles_list), ~ .x %>% 
            set_names(column_names))

注意:最好将其保存在list 中,并且不要修改全局环境中的对象

【讨论】:

  • 第一个示例失败 - 抱怨“找不到模式‘函数’的对象‘Alpha’ - 但第二个示例有效!谢谢!
  • @jbfink 对不起,应该有~现在试试
  • 实际上@akrun 还有一个问题——当我执行地图功能时,小标题实际上并没有“保存”——执行这些地图中的任何一个,然后直接调用小标题(例如,只是通过在控制台中输入“df1”)会显示旧的列名。我该如何解决?
  • @jbfink 我正在开会。忘记了 tibbles_list 是一个字符向量。试试list2env更新了会议
【解决方案2】:

首先,如果您使用的是数据框列表,而不是您需要从环境中拉出的数据框名称列表,您会好多 .如果您在这件事上有选择权,那就太好了;如果没有,您可以将这些数据框复制到一个列表中。

How do I make a list of data frames? 帖子有 7 个答案,其中有多种方法和原因,包括如果您没有从列表开始的奢侈的方法。

处理完之后,您可以使用基本setNames(或rlang 包装器set_names,此处不需要其功能)设置名称,它本身就是names 的包装器.使用purrr 映射函数,或lapply 用于基本版本。

library(dplyr)

dfs <- list(df1, df2, df3, df4)
dfs %>%
  purrr::map(~setNames(., column_names))
#> [[1]]
#> # A tibble: 1 x 5
#>   Alpha Bravo Charlie Delta  Echo
#>   <dbl> <dbl>   <dbl> <dbl> <dbl>
#> 1     1     2       3     4     5
##### cutting remaining output

lapply(dfs, function(x) setNames(x, column_names))
# same output as above

因为setNamesnames 的包装器:

lapply(dfs, function(x) {
  names(x) <- column_names
  x
})
# same output again

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-03
    • 2016-09-28
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 2020-10-10
    相关资源
    最近更新 更多