如何使用lapply在R中更改这样的colnames?

时间:2012-06-29 20:38:27

标签: r functional-programming

?以下是R的互动环境输出。

我尝试更改P300.H1P300.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"

我认为问题可能与作业有关,但我仍然对此感到困惑。

有人可以向我解释原因吗?

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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"

答案 2 :(得分:1)

如果您确实将每个列的名称更改为相同的名称集,这里有一种简单的方法(仅适用于少量数据帧):

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

答案 3 :(得分: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:它只是它的副本,并且您对它所做的任何更改都会赢不适用于原件。