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
ですか?