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

これを回避する 1 つの方法は、インデックス (名前) をループして、関数内でサブセット化を行うことです。

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

ここに1つのアイデアがあります。

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 に答える