16

この1行のRコードがどのように機能するかを誰か説明してもらえますか?

split(dat, f) <- lapply(split(dat, f), max)

単なるリサイクルルールだと思っていたのですが、よくわかりません。

データ例:

dat <- c(1, 2, 3, 100, 200, 300)
f <- as.factor(c("a", "a", "b", "a", "b", "b"))
split(dat, f) <- lapply(split(dat, f), max)
dat
[1] 100 100 300 100 300 300

コードは私がやりたいことを行います(グループごとに最大値を割り当てます)が、問題はこれがどのように行われるかです?

4

2 に答える 2

9

分割により、ベクトルからの値が得られdat[c(1,2,4)]ますdat[c(3,5,6)]

割り当ては に相当しdat[c(1,2,4)] <- 100 ; dat[c(3,5,6)] <- 300、ここでリサイクルが行われます。

編集済み

何が起こるか、なぜベクトル代入が生じるのかについては、言語定義マニュアル (http://cran.r-project.org/doc/manuals/R-lang.pdf) の 21 ページを参照してください。呼び出し:

split(def, f) <- Z

次のように解釈されます。

‘*tmp*‘ <- def
def <- "split<-"(‘*tmp*‘, f, value=Z)
rm(‘*tmp*‘)

split<-.default変更されたベクトルを返すことに注意してください。

于 2013-01-12T14:15:20.987 に答える
5

コメントのおかげで、答えはsplit<-.default

その動作を説明するために、ここ split<-.defaultで、質問の呼び出しの結果で を呼び出します

`split<-.default` <- function(dat, f,value = lapply(split(dat, f), max))
{
    ix <- split(seq_along(dat), f, drop = drop, ...)  ## the call of split here!!
    n <- length(value)
    j <- 0
    for (i in ix) {
        j <- j %% n + 1
        x[i] <- value[[j]]  ## here we assign the result of the first split
    }
    x
}
于 2013-01-12T14:16:03.453 に答える