1

以下は、R の対話型環境の出力です。

P300.H1P300.GMおよびの colnames を変更しようとしましたが、うまくいき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"

問題は割り当てに関するものかもしれないと思いますが、それについてはまだ混乱しています。

その理由を説明できる人はいますか?

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 に答える