假设我有
a <- data.frame( z = rep( c("A", "B", "C"), 2 ), p = 1:6, stringsAsFactors=FALSE )
b <- data.frame( z = c( rep( "A", 5), rep( "B", 5 ) ), q = 1:10, stringsAsFactors=FALSE )
并希望在使用a
函数迭代b
时操纵plyr
,例如
library(plyr)
d_ply( b, "z", function( x ){
a[ a$z == x[1, "z"], "p" ] <<- a[ a$z == x[1, "z"], "p" ] + sum(x$q)
})
在这种情况下,我必须使用<<-
进行分配才能在a
之外更改d_ply
。如果我仅使用<-
a
,则不会更改。我绝对想避免的是迭代a
,因为b$z
只包含a$z
的一小部分。
所以我的问题是:
plyr
的简单且高效的解决方案,以避免<<-
?for( i in unique(b$z) ){ ... }
)?<<-
有什么影响吗?我是否可以确定在任何情况下只会操纵与a
电话最接近的d_ply
(就环境而言)?特别是因为这是ReferenceClass方法的所有部分。答案 0 :(得分:1)
这是一个使用data.table
代替plyr
library(data.table)
a <- data.table(a, key="z")
b <- data.table(b, key="z")
a[b[, sum(q), by=z], p := p + V1]
z p
1: A 16
2: A 19
3: B 42
4: B 45
5: C 3
6: C 6
关于你的第三个问题并使用<<-
,我会建议不要这样做。
如果要分配到不同的环境,请使用assign(., envir=.)
功能,该功能允许您指定要分配的环境。