1

假设我有

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迭代时进行操作,例如bplyr

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)
})

在这种情况下,我必须使用<<-分配才能ad_ply. 如果我只使用<- a不会改变。我绝对要避免的是迭代,a因为b$z它只包含a$z.

所以我的问题是:

  1. 是否有一个简单而高效plyr的解决方案可以避免<<-
  2. 是否有另一个方便的解决方案(也许除了for( i in unique(b$z) ){ ... })?
  3. 如果我坚持我的解决方案,以这种方式使用是否有任何影响<<-?我可以确定在任何情况下都只会操纵最接近a(就环境而言)呼叫的人吗?d_ply特别是因为这都是 ReferenceClass 方法的一部分。
4

1 回答 1

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=.)允许您指定分配到哪个环境的功能。

于 2013-04-25T16:28:03.760 回答