访问函数中的plyr id变量

访问函数中的plyr id变量,r,plyr,R,Plyr,在使用d*ply或l*ply时,我经常遇到需要访问实际id变量的问题。一个简单(但毫无意义)的例子是: df1 <- data.frame( p = c("a", "a", "b", "b"), q = 1:4 ) df2 <- data.frame( m = c("a", "b" ), n = 1:2 ) d_ply( df1, "p", function(x){ actualId <- unique( x$p ) print( mean(x$q)^df2[ df2$m

在使用
d*ply
l*ply
时,我经常遇到需要访问实际id变量的问题。一个简单(但毫无意义)的例子是:

df1 <- data.frame( p = c("a", "a", "b", "b"), q = 1:4 )
df2 <- data.frame( m = c("a", "b" ), n = 1:2 )

d_ply( df1, "p", function(x){
 actualId <- unique( x$p )
 print( mean(x$q)^df2[ df2$m == actualId, "n" ] )
})

有什么建议吗?有什么我忽略的吗?

我不确定有什么方法可以做到这一点,因为匿名函数的唯一参数是列表元素值,没有它的名称:

l_ply( list(a = 1, b = 2, c = 3), function(x){
  print(class(x))
})
[1] "numeric"
[1] "numeric"
[1] "numeric"
但是,如果您以列表或数据框的形式返回命令的结果,则会保留名称供您以后使用:

llply( list(a = 1, b = 2, c = 3), function(x){
  x
})
$a
[1] 1

$b
[1] 2

$c
[1] 3
除了Josh解决方案外,还可以使用
mapply
m*ply
将列表元素的名称和值传递给函数:

d <- list(a = 1, b = 2, c = 3)
myfunc <- function(value, name) {
  print(as.character(name))
  print(value)
}
mapply(myfunc, d, names(d))
m_ply(data.frame(value=unlist(d), name=names(d)), myfunc)
d这里有一个想法

l_ply( list(a = 1, b = 2, c = 3), function(x){
     print(eval(substitute(names(.data)[i], parent.frame())))
})
# [1] "a"
# [1] "b"
# [1] "c"

(看看
l\u ply
的最后一个代码块,看看我从哪里得到了名称
.data
I

我解决这个问题的一种方法是循环索引(名称)并在函数中进行子集设置

l <- list(a = 1, b = 2, c = 3)
l_ply(names(l), function(x){
  print(x)
  myl <- l[[x]]
  print(myl)
})

@朱巴,为什么不呢?我知道从一开始就有很多可能避免这个问题。例如,从一开始就使用for循环,合并data.frames,将数据引入另一个结构。但我的问题是,如果我想这样做,有没有可能?我的意思是,
l*ply
的目标是依次对列表中的每个元素应用一个函数,然后聚合并返回结果。因此,您实际上不需要知道函数中元素的名称。但我可能会错过一些重要的东西:)@juba这也是我对它的理解,也许我只是滥用了
l*ply
,而for循环或
lappy
更合适。如果是这样的话,我会接受:-)@Beasterfield你可能想在(搜索“循环模式”)@hadley上阅读我对这个问题的看法,通过devtools wiki阅读总是很有启发性:-)或者你可以用一根棍子戳我的眼睛:p这基本上就是我在寻找的,尽管我希望有更短的东西。另外,看看我能看到的代码,这显然只适用于
l_ply
,而不适用于
l ply
。实际上,这不是我问题的答案,但我认为这是我问题的最佳解决方案。
l <- list(a = 1, b = 2, c = 3)
l_ply(names(l), function(x){
  print(x)
  myl <- l[[x]]
  print(myl)
})
l_ply(l, function(myl) {
  print(myl)
})