3

我正在处理一堆货币数据 .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。

那么我怎样才能将字符串转换为我可以在这里使用的变量名呢?或者我的方法在这里完全错误?

非常感谢!

克里斯

4

3 回答 3

8

您正在寻找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'))
于 2013-02-23T14:04:33.960 回答
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<-在第一个分配之前放置)

于 2013-02-23T14:18:09.577 回答
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

您可以看到列名“恰到好处”。

于 2013-02-23T14:00:40.857 回答