2012-06-29 70 views
1

?以下是R的交互式環境輸出。如何使用lapply在R中更改像這樣的名稱?

我嘗試更改P300.H1,P300.GMSuz12.H1的染色體名稱,但沒有奏效。

> lapply(list(P300.H1,P300.GM,Suz12.H1), function(x) {colnames(x) <- c("chrom","start", "end", "name", "score")}) 
[[1]] 
[1] "chrom" "start" "end" "name" "score" 

[[2]] 
[1] "chrom" "start" "end" "name" "score" 

[[3]] 
[1] "chrom" "start" "end" "name" "score" 

> colnames(P300.H1) 
[1] "V1" "V2" "V3" "V4" "V5" 

我認爲這個問題可能與作業有關,但我仍然對此感到困惑。

有人可以向我解釋有關的原因嗎?

+0

使用setNames檢查這個相關,簡單的答案http://stackoverflow.com/questions/19942762/assign-column-names-to-list-of-dataframes – ano

回答

3

有可能是一個更好的方法,並利用assign這樣可以讓你陷入困境:

d1 <- d2 <- data.frame(x=1, y=2) 

myfun <- function(x) { 
    x.df <- get(x) 
    colnames(x.df) <- c('n1', 'n2') 
    assign(x, x.df, env=.GlobalEnv) 
} 

lapply(c('d1', 'd2'), myfun) 
0

R按值傳遞,而不是引用,所以更改函數內數據框的列名不會改變它的功能。

作爲一個簡單的,可再現例如:

m <- matrix(rnorm(12), ncol=3) 
colnames(m) <- c("A", "B", "C") 

change.names = function(x) { 
    colnames(x) <- c("X", "Y", "Z") 
} 

change.names(m) 
print(colnames(m)) 

的列名仍將是A,B,C.該函數內的x不是矩陣m:它只是它的複製和您對它做出的任何更改都不適用於原件。

1

使用for循環在這裏可能會比使用lapply更容易和/或更安全的(或至少這是什麼來想起在下午4點星期五):

DF <- data.frame(x = c(1, 2, 3,NA), y = c(1,0, 10, NA), z=c(43,NA, 33, NA)) 
#make your list 
yourList <- list(DF,DF) 

for (i in seq(yourList)){ 
    colnames(yourList[[i]]) <- c("foo", "bar", "baz") 
} 
#Confirm output is right 
> lapply(yourList, colnames) 
[[1]] 
[1] "foo" "bar" "baz" 

[[2]] 
[1] "foo" "bar" "baz" 
1

如果你真的改變每個列名相同的組名稱,這裏有一種瑣碎的方式(這僅適用於一小數目的數據幀):

colnames(P300.H1) <- colnames(P300.GM) <- colnames(Suz12.H1) <- c("chrom","start", "end", "name", "score")