如何在String中将String转换为变量名

时间:2013-02-23 13:52:37

标签: string r variables

我正在使用一堆货币数据.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转换为我可以在这里使用的变量名? 或许我的方法在这里完全错了?

非常感谢!

克里斯

3 个答案:

答案 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

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