我正在使用一堆货币数据.csv文件。这些.csv没有使用colnames函数添加的标题。
colnames(variable_name) <- c('Date', 'Time', 'Open', 'Close', 'Volume')
数据导入和列标题的分配应该使用for循环自动完成。数据框的名称是文件名的一部分。
file_names <- list.files()
for (i in 1:length(file_names)){
assign(substr(file_names,1,6)[i], read.csv(file_names[i], header=F))
colnames(variable_name) <- c('Date', 'Time', 'Open', 'Close', 'Volume')
}
如何设法将variable_name输入到colnames函数中。 我尝试使用:
colnames(substr(file_names,1,6)[i])
但那会给我输入“AUDUSD”,我需要输入没有引号的AUDUSD。
那么如何才能将String转换为我可以在这里使用的变量名? 或许我的方法在这里完全错了?
非常感谢!
克里斯
答案 0 :(得分:6)
您正在寻找get
。你的代码看起来像这样:
file_names <- list.files()
short_names <- substr(file_names, 1, 6)
for (i in seq_along(file_names)) {
assign(short_names[i], read.csv(file_names[i], header = FALSE))
colnames(get(short_names[i])) <- c('Date', 'Time', 'Open', 'Close', 'Volume')
}
但似乎更容易使用col.names
函数中的read.*
选项,请尝试:
assign(short_names[i], read.csv(file_names[i], header = FALSE,
col.names = c('Date', 'Time', 'Open',
'Close', 'Volume'))
如果您不熟悉* apply系列函数,则可以将整个循环替换为:
mapply(assign, short_names, lapply(file_names, read.csv, header = FALSE,
col.names = c('Date', 'Time', 'Open',
'Close', 'Volume'))
答案 1 :(得分:3)
我建议您使用列表。这样,事情变得美好而干净:
file_names <- list.files()
data <- lapply (file_names, read.csv, header = FALSE)
names (data) <- substr(file_names, 1, 6) # now you can access data$AUDUSD
## colnames for all data.frames
data <- lapply (data, `colnames<-`, c('Date', 'Time', 'Open', 'Close', 'Volume'))
更容易:
data <- lapply (file_names, read.csv, header = FALSE,
col.names = c ('Date', 'Time', 'Open', 'Close', 'Volume'))
names (data) <- substr (file_names, 1, 6) # now you can access data$AUDUSD
(就个人而言,我将所有这些data.frames放到一个,另外一列包含$conversion
左右)
但是,您当然可以将每个data.frame都放在自己的变量中。在这种情况下,get
需要一点小心:
> colnames (get (variable_name)) <- c('Date', 'Time', 'Open', 'Close', 'Volume')
error: "target of assignment expands to non-language object")
(错误消息是反向翻译的)
但这有效:
tmp <- get (variable_name) # in your case, rather do: tmp <- read.csv (...)
colnames (tmp) <- letters [1:2]
assign (variable_name, tmp)
(无论如何,我将colnames<-
放在第一次分配之前。
答案 2 :(得分:0)
我认为你没有得到你认为你得到的东西。这是我的测试用例:
Rgames> foo[1:6]
[1] "aggfrac.R" "AJtranslate.c" "AJtranslate.R" "anaclock.R"
[5] "apollo.R" "askrm.R"
Rgames> bar<-matrix(nr=2,nc=5)
Rgames> colnames(bar)<-substr(foo,1,6)[1:5]
Rgames> bar
aggfra AJtran AJtran anaclo apollo
[1,] NA NA NA NA NA
[2,] NA NA NA NA NA
您可以看到列名称“恰到好处”。