?以下是R的互动环境输出。
我尝试更改P300.H1
,P300.GM
和Suz12.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 :(得分: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
:它只是它的副本,并且您对它所做的任何更改都会赢不适用于原件。