我正在从目录中读取几个excel文件,并且希望根据字符串向量对读取的数据帧进行动态命名
我有一个字符串,其国家名称
cnts <- c("de", "ar", "fr")
然后我读取了一个excel文件,其路径已存储在矢量文件中
df <- read.xlsx(file[1], 1)
现在我想将df重命名为国家/地区向量中的第一个元素,所以我
cnts[1] <- df
但这不起作用,并给我一个错误
以cnts [2] <-df 要替换的项目数不是替换长度的倍数
我希望将df重命名为de 我知道问题所在,它正在尝试将整个df写入位置1的字符串向量,但是如何动态地 重命名数据帧?
答案 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)