【问题标题】:Change name of dataframe based on a string vector根据字符串向量更改数据框的名称
【发布时间】:2019-06-26 12:57:37
【问题描述】:

我正在从一个目录中读取几个 excel 文件,我希望读取的数据帧根据字符串向量动态命名

我有一个包含国家名称的字符串向量 cnts <- c("de", "ar", "fr")

然后我读取了一个excel文件,它的路径已经存储在一个向量(文件)中 df <- read.xlsx(file[1], 1) 现在我想将 df 重命名为国家向量中的第一个元素,所以我这样做了 cnts[1] <- df

但这不起作用并给我一个错误

在cnts[2]

我希望将 df 重命名为 de 我知道问题所在,它试图将整个 df 写入位置 1 的字符串向量,但是我如何动态地 重命名数据帧?

【问题讨论】:

  • 我不明白你需要什么。您想要一个名为“de”的变量,它将包含数据框 df ? (第二个变量是“ar”,其中包含第二个数据框等......)

标签: r dataframe


【解决方案1】:

cnts[1] <- df 表示您尝试将数据帧存储在长度为 1 "de" <- df 的字符串中。

你可以使用assign,你必须阅读why using assign is bad

cnts <- c("de", "ar", "fr")

df <- data.frame(a=1:5)

assign(cnts[1], df)
de

更好的做法是使用大小为cnts 的列表并将数据框影响到列表的右侧元素。

【讨论】:

  • 完全符合您的要求。 OP 应该查看lists 或其他数据结构。
【解决方案2】:

使用cnts[1] &lt;- df,您告诉 R 将数据帧添加到字符向量 cnts 的第一个元素,这是不可能的。您可以使用assign 来实现您想要的,但普遍的共识是应该避免使用assign,尤其是在以编程方式导入多个文件时。一开始可能有点违反直觉,但将数据框放在命名列表中通常更有意义,例如:

cnts <- c("de", "ar", "fr")

# Create an empty list with names from `cnts`.
df_list <- vector(mode = "list", length = length(cnts))
names(df_list) <- cnts

# Read in the XLSX and add to appropriate list element.
df_list[[cnts[1]]] <- read.xlsx(file[1])

您也可以只使用df_list &lt;- list() 而不是df_list &lt;- vector(mode = "list", length = length(cnts)),但前者更有效,尤其是当您的列表变得更长时。您可以在您的情况下使用其中任何一种,但是学习可以让您在以后遇到挫折的好习惯永远不会太早。

你最终会得到类似下面的对象:

$de
  one two
1   1   3
2   2   4

$ar
  one two
1   1   3
2   2   4

$fr
  one two
1   1   3
2   2   4

如果你想要超级高效,你也可以这样做,假设cnts 中的名称和file 中的文件名在位置上匹配:

df_list <- lapply(file, read.xlsx)
names(df_list) <- cnts

【讨论】:

  • 我喜欢你的建议,但对于刚接触列表的人来说,`names&lt;-`(vector(mode = "list", length = length(cnts)), cnts) 会非常令人困惑——而且通常初始化列表的方法是 df_list &lt;- list()(或使用 @ 987654334@)。为什么不在列表填写后直接命名,使用标准的names(df_list) &lt;- cnts
  • @Gregor 好点。用names&lt;-() 修复了该部分,但我不同意使用vector,因为增长向量不是很好的做法。但是,我确实使用lapply 扩展了部分。
【解决方案3】:

另一种选择是将所有数据集读入list,将list元素的名称设置为'cnts'(假设顺序相同)并用大量对象污染全局环境(@987654323 @)

list2env(setNames(lapply(files, read.xlsx), cnts), .GlobalEnv)

【讨论】:

    猜你喜欢
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    相关资源
    最近更新 更多