6

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

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

所以在d*ply功能的情况下,我可以帮助自己unique( x$p )。但是说到l*ply,我不知道如何访问相应列表元素的名称。

l_ply( list(a = 1, b = 2, c = 3), function(x){
  print( <missing code> )
})
# desired output
[1] "a"
[1] "b"
[1] "c"

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

4

3 回答 3

4

我解决这个问题的一种方法是遍历索引(名称)并在函数中进行子集化。

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

myl然后将与

l_ply(l, function(myl) {
  print(myl)
})
于 2013-01-31T17:22:40.803 回答
2

这是一个想法。

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_ply看看我在哪里得到了名字.datai。)

于 2013-01-31T13:41:00.313 回答
1

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

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 解决方案,您还可以将列表元素的名称和值传递给带有mapplyor的函数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)
于 2013-01-31T13:21:30.830 回答