我经常遇到使用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" ] )
})
所以在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"
有什么建议吗?我忽略了什么?
答案 0 :(得分: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)
})
答案 1 :(得分: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
的最终代码块,了解我在哪里获得名称.data
和i
。)
答案 2 :(得分:1)
我不确定有没有办法做到这一点,因为你的匿名函数的唯一参数是list元素值,没有它的名字:
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)