1

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

我尝试更改 , 和 的 colnames 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

4 回答 4

2

可能有更好的方法,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)
于 2012-06-29T20:48:03.327 回答
1

如果您真的要将每个列的名称更改为相同的名称集,这是一种简单的方法(仅适用于少量数据框):

colnames(P300.H1) <- colnames(P300.GM) <- colnames(Suz12.H1) <- c("chrom","start", "end", "name", "score")
于 2012-06-29T20:51:34.823 回答
0

在这里使用 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"
于 2012-06-29T20:49:47.333 回答
-1

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:它只是它的副本,您对它所做的任何更改都不会应用于原始矩阵。

于 2012-06-29T20:41:54.953 回答