浏览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
?