0

関数を行ごとに適用するために、行列に適用を使用します。私の構文は次のとおりです。

res = apply(X,1,MyFunc)

上記の関数MyFuncは、2つの値のリストを返します。しかし、この適用アプリケーションの結果は奇妙な構造であり、Rは独自の(ハウスキーピング?)データの一部を追加しているようです:

res = $`81`
$`81`$a
[1] 80.8078

$`81`$b
[1] 6247

私が待っている結果は単純ですが:

res = $a
[1] 80.8078

$b
[1] 6247

なぜこの奇妙な81ものがRによって挿入されたのか、どうすればそれを取り除くことができるのかわかりません。手伝ってくれてありがとう

4

2 に答える 2

3

これは完全に正常な動作です。名前付きの行を持つ行列に関数を適用しています。関数は各行のリストを返し、このリストの新しいリスト内の各要素には、対応する行名で名前が付けられます。

あなたが説明したものを再現する例を次に示します。

x <- matrix(1:4, nrow=2)
rownames(x) <- 80:81

myFunc <- function(x)list(a=1, b=2)

xx <- apply(x, 1, myFunc)
xx

これは以下を返します:

$`80`
$`80`$a
[1] 1

$`80`$b
[1] 2


$`81`
$`81`$a
[1] 1

$`81`$b
[1] 2

このリストの構造を見てください。

str(xx)
List of 2
 $ 80:List of 2
  ..$ a: num 1
  ..$ b: num 2
 $ 81:List of 2
  ..$ a: num 1
  ..$ b: num 2

最初の要素にインデックスを付けるには、次を使用しますxx[[1]]

xx[[1]]
$a
[1] 1

$b
[1] 2

これは、あなたが何を意図したかについての推測です...リストを返すのではなく、ベクトルを返す場合、の結果はapply行列になります。

myFunc <- function(x)c(a=1, b=2)
apply(x, 1, myFunc)
  80 81
a  1  1
b  2  2

名前なしで特定の行を取得するには、次のようにします。

unname(xx[2, ])
[1] 2 2
于 2012-10-31T16:06:49.837 に答える
0

マトリックス ( ) がどのXように見えるかを知っておくと役立ちます。次のようなことを試してみましょう。

mf <- function(x) list(a=sum(x),b=prod(x))
mat <- matrix(1:6,nrow=2)

それで:

> apply(mat,1,mf)
[[1]]
[[1]]$a
[1] 9

[[1]]$b
[1] 15


[[2]]
[[2]]$a
[1] 12

[[2]]$b
[1] 48

各行が生成するリストを区別するには、最初の添え字が必要です。行名に番号が付けられているため、表示されていると思われます$`81`

于 2012-10-31T16:10:10.407 に答える