2014-09-21 89 views
2

我想通過一堆數據集並在R中更改列。 我有一堆數據集,比如說a,b,c等,並且所有這些數據集有三列,比如X,Y,Z. 我想將它們的名稱更改爲a_X,a_Y,a_Z用於數據集a,b_X,b_Y,b_Z用於數據集b,依此類推。R - 通過數據集循環並更改列名稱

這裏是我的代碼:

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 = "")); 
} 

然而,上面的代碼不工作,因爲我是在文本格式。 我已經考慮過分配函數,但似乎也不適合。 如果有任何想法,我將不勝感激。

回答

3

事情是這樣的:

list2env(lapply(mget(name.list),function(dat){ 
    colnames(dat) <- paste(nn,colnames(dat),sep='_') 
    dat 
}),.GlobalEnv) 
2
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 
2

下面是一些免費的數據:

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) 

這裏是一個使用mget的方法和一個自定義功能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 

通過將a,bc放入他們自己的環境(甚至列表)中,您也可以避免getmget。您也如果你走這條路線將不需要的name.list載體,因爲它是一樣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) 

做這種方式的另外一個振作的是,你還必須在環境e未受破壞的數據幀。沒有任何內容被覆蓋(檢查ae$a)。