我如何在R中将函数名称与for一起使用

时间:2018-08-19 13:16:43

标签: r

我的R代码有点问题。我不知道在哪里,但我犯了一个错误。 问题是:

我有许多文件excel,它们具有相同的列名。我想更改矩阵的标题以及其他标题。

这是五个文件。

AA <- read_excel("AA.xlsx") 
BB <- read_excel("BB.xlsx")
CC <- read_excel("CC.xlsx")
DD <- read_excel("DD.xlsx")
EE <- read_excel("EE.xlsx")

head(AA) #the matrix is the same for the other file. DATA Open Max Min Close VAR % CLOSE VOLUME <dttm> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 2004-07-07 00:00:00 3.73 3.79 3.6 3.70 0 21810440 2 2004-07-08 00:00:00 3.7 3.71 3.47 3.65 -1.43 7226890 3 2004-07-09 00:00:00 3.61 3.65 3.56 3.65 0 3754407 4 2004-07-12 00:00:00 3.64 3.65 3.59 3.63 -0.55 850667 5 2004-07-13 00:00:00 3.63 3.63 3.58 3.59 -1.16 777508 6 2004-07-14 00:00:00 3.54 3.59 3.47 3.5 -2.45 1931765

为了快速更改标题,我决定使用此代码。

t <- list(AA, BB, CC, DD, EE)
for (i in t ) {
names(i) <- c("DATA", "OPE", "MAX", "MIN", "CLO", "VAR%", "VOL")
} #R dosen't give any type of error!


head(AA) #the data are the same, as the for dosen't exits. 

哪里错了?

非常感谢您。

弗朗切斯科

2 个答案:

答案 0 :(得分:0)

我们可以使用lapply来做到这一点。使用list获取mget中的数据集,遍历list,将列名称设置为名称向量('nm1 )并使用list2env

修改全局环境中的对象
nm1 <- c("DATA", "OPE", "MAX", "MIN", "CLO", "VAR%", "VOL")
lst <- lapply(mget(nm2), setNames, nm1)
list2env(lst, envir = .GlobalEnv)

或者使用for循环,遍历对象名称的字符串和assign列名称,直到全局环境中的对象

for(nm in nm2) assign(nm, `names<-`(get(nm), nm1))

或使用tidyverse

library(tidyverse)
mget(nm2) %>% 
    map(set_names, nm1) %>%
    list2env(., envir = .GlobalEnv)

数据

AA <- mtcars[1:7]
BB <- mtcars[1:7]
CC <- mtcars[1:7]
DD <- mtcars[1:7]
EE <- mtcars[1:7]
nm2 <- strrep(LETTERS[1:5], 2)

答案 1 :(得分:0)

我试图解释为什么您的代码无法正常工作。在列表t中,AA(t [[1]])的地址与全局环境中的AA相同。在for循环中,i最初与全局环境中的data.frame AA相同。用i更改names(i) <-的名称时,data.frame i被复制两次。最后,您要在全局环境中更改新的data.frame i的名称,而不是原始的data.frame AA

这里有一个例子来说明我的意思({tracemem“标记一个对象,以便每当内部代码复制该对象时都显示一条消息。”)

tracemem(mtcars)
# [1] "<0x1095b2150>"
tracemem(iris)
# [1] "<0x10959a350>"

x <- list(mtcars, iris)

for(i in x){
    cat('-------\n')
    tracemem(i)
    names(i) <- paste(names(i), 'xx')
}
# -------
# tracemem[0x1095b2150 -> 0x10d678c00]: 
# tracemem[0x10d678c00 -> 0x10d678ca8]: 
# -------
# tracemem[0x10959a350 -> 0x10cb307b0]: 
# tracemem[0x10cb307b0 -> 0x10cb30818]: