根据字符串向量更改数据帧的名称

时间:2019-06-26 12:57:37

标签: r dataframe

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

我有一个字符串,其国家名称 cnts <- c("de", "ar", "fr")

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

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

  

以cnts [2] <-df     要替换的项目数不是替换长度的倍数

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

3 个答案:

答案 0 :(得分:2)

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的列表,并将数据框影响到列表右侧的元素。

答案 1 :(得分:2)

使用cnts[1] <- 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 <- vector(mode = "list", length = length(cnts))来代替df_list <- list(),但是前者的效率更高,尤其是当您的列表越来越长时。您可以根据自己的情况使用任一种,但是学习良好的习惯永远不会太早,这将使您免于遭受挫折。

您最终将得到以下对象:

$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

答案 2 :(得分:0)

另一种选择是将所有数据集读入list,用'cnts'设置list元素的名称(假定顺序相同),并用很多对象(list2env

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