简体   繁体   中英

R - Looping through datasets and change column names

I'm trying to loop through a bunch of datasets and change columns in R. I have a bunch of datasets, say a,b,c,etc, and all of them have three columns, say X, Y, Z. I would like to change their names to be a_X, a_Y, a_Z for dataset a, and b_X, b_Y, b_Z for dataset b, and so on.

Here's my code:

name.list = ("a","b","c")
for(i in name.list){
    names(i) = c(paste(i,"_X",sep = ""),paste(i,"_Y",sep = ""),paste(i,"_Y",sep = ""));
}

However, the code above doesn't work since i is in text format. I've considered assign function but doesn't seem to fit as well. I would appreciate if any ideas.

Something like this :

list2env(lapply(mget(name.list),function(dat){
  colnames(dat) <- paste(nn,colnames(dat),sep='_')
  dat
}),.GlobalEnv)
for ( i in name.list) { 
         assign(i, setNames( get(i), paste(i, names(get(i)), sep="_")))
                       }

> a
  a_X a_Y a_Z
1   1   3   A
2   2   4   B
> b
  b_X b_Y b_Z
1   1   3   A
2   2   4   B
> c
  c_X c_Y c_Z
1   1   3   A
2   2   4   B

Here's some free data:

a <- data.frame(X = 1, Y = 2, Z = 3) 
b <- data.frame(X = 4, Y = 5, Z = 6)
c <- data.frame(X = 7, Y = 8, Z = 9)

And here's a method that uses mget and a custom function foo

name.list <- c("a", "b", "c")
foo <- function(x, i) setNames(x, paste(name.list[i], names(x), sep = "_"))
list2env(Map(foo, mget(name.list), seq_along(name.list)), .GlobalEnv)
a
#   a_X a_Y a_Z
# 1   1   2   3
b
#   b_X b_Y b_Z
# 1   4   5   6
c
#   c_X c_Y c_Z
# 1   7   8   9

You could also avoid get or mget by putting a , b , and c into their own environment (or even a list). You also wouldn't need the name.list vector if you go this route, because it's the same as ls(e)

e <- new.env()
e$a <- a; e$b <- b; e$c <- c
bar <- function(x, y) setNames(x, paste(y, names(x), sep = "_"))
list2env(Map(bar, as.list(e), ls(e)), .GlobalEnv)

Another perk of doing it this way is that you still have the untouched data frames in the environment e . Nothing was overwritten (check a versus e$a ).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM