6

ave関数を調べてみると、注目すべき行が見つかりました。

split(x, g) <- lapply(split(x, g), FUN) # From ave

興味深いことに、この行は の値を変更しますx。これは予想外でした。私split(x,g)はそれが割り当てられる可能性のあるリストになると思っていましたが、後で破棄されました。私の質問は、なぜ の値がx変化するのですか?

別の例は、よりよく説明するかもしれません:

a <- data.frame(id=c(1,1,2,2), value=c(4,5,7,6))
#   id value
# 1  1     4
# 2  1     5
# 3  2     7
# 4  2     6

split(a,a$id) # Split a row-wise by id into a list of size 2
# $`1`
#   id value
# 1  1     4
# 2  1     5
# $`2`
#   id value
# 3  2     7
# 4  2     6

# Find the row with highest value for each id
lapply(split(a,a$id),function(x) x[which.max(x$value),])
# $`1`
#   id value
# 2  1     5
# $`2`
#   id value
# 3  2     7

# Assigning to the split changes the data.frame a!
split(a,a$id)<-lapply(split(a,a$id),function(x) x[which.max(x$value),])
a
#   id value
# 1  1     5
# 2  1     5
# 3  2     7
# 4  2     7

変更されただけでなくa、代入の右辺とは思えない値に変更されました! への代入がsplit(a,a$id)何らかの形で変更されたとしてもa(これはわかりません)、なぜ adata.frameではなく a になるのlistでしょうか?

このタスクを達成するためのより良い方法があることを理解していることに注意してください。私の質問は、なぜsplit(a,a$id)<-lapply(split(a,a$id),function(x) x[which.max(x$value),])変化するのaですか?

4

3 に答える 3

2

分割のヘルプページのヘッダーには、「置換フォームは、そのような分割に対応する値を置換します」と記載されています。ですから、広く使われているわけではないことは認めますが、それは本当に予想外のことではありません。あなたの例が、割り当てられた値が「割り当てのRHSのように見えない」ことをどのように示しているのかわかりません。最大値は、2番目の引数係数によって定義されたカテゴリ内の「値」リストに割り当てられます。

(質問ありがとうございます。それがsplit<-核心にあることに気づいていませんでしたave。とても便利な機能だと思うので、思ったよりも広く使われていると思いaveます。)

于 2012-10-10T17:00:48.960 に答える
1

a、 performの定義の直後split(a, a$id)=1、結果は次のようになります。

> a
  id value
1  1     1
2  1     1
3  1     1
4  1     1
于 2012-10-10T16:53:41.583 に答える
0

ここで重要なのは、 split<- 実際に LHS を RHS 値で変更したことです。

次に例を示します。

> x <- c(1,2,3);
> split(x,x==2)
$`FALSE`
[1] 1 3
$`TRUE`
[1] 2
> split(x,x==2) <- split(c(10,20,30),c(10,20,30)==20)
> x
[1] 10 20 30

を再割り当てする行に注意してくださいsplit(x,x==2) <-。これは実際に を再割り当てしxます。

以下のコメントが述べているように、split<-そのような定義を調べることができます

> `split<-.default`
function (x, f, drop = FALSE, ..., value) 
{
    ix <- split(seq_along(x), f, drop = drop, ...)
    n <- length(value)
    j <- 0
    for (i in ix) {
        j <- j%%n + 1
        x[i] <- value[[j]]
    }
    x
}
<bytecode: 0x1e18ef8>
<environment: namespace:base>
于 2012-10-10T16:54:52.283 に答える