如何在R中将字符串转换为变量名

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。

那么我如何将字符串转换为可以在此处使用的变量名呢? 或者我的方法完全错误了吗?

非常感谢!

克里斯


3
@Joshua:错误的复制。原帖的作者正在寻找“get”,而你引导他去使用“assign”。 - flodel
5
没问题,这里是一个get重复问题。我们真的需要重新回答那些在R文档示例(如本例中的?assign)和R FAQ(7.21)中已经有答案的问题吗? - Joshua Ulrich
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')
}

但从read.*函数中使用col.names选项似乎更容易,尝试如下:

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'))

我认为names(get(x))不起作用; 有一个问题问到了它,但我现在找不到它。错误是“分配目标扩展到非语言对象”。无论如何,col.names选项是正确的方法。 - Aaron left Stack Overflow

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

个人认为,将所有的数据框放入一个中,并添加一列$conversion或类似的列。

当然,你也可以将每个数据框放入自己的变量中。在这种情况下,需要注意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<-放在第一次赋值之前。


谢谢你指出这种方法!由于我是R的新手,像这样的答案将指引我朝着正确的方向前进。 - user2102383

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

你可以看到列名字是“刚刚好”的。


我认为问题在于 bar 是在函数内部生成的。 - Aaron left Stack Overflow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接