0

我使用 apply 到一个矩阵,以便逐行应用一个函数。我的语法如下:

res = apply(X,1,MyFunc)

上面的函数 MyFunc 返回一个包含两个值的列表。但是这个应用程序的结果是一个奇怪的结构,其中 R 似乎添加了一些自己的(内务管理?)数据:

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

$`81`$b
[1] 6247

而我等待的结果很简单:

res = $a
[1] 80.8078

$b
[1] 6247

我不知道为什么81R 会插入这个奇怪的东西,我该如何摆脱它。感谢帮助

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 回答