R奇怪申请退货

时间:2012-10-31 15:47:55

标签: r

我使用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

我不知道为什么R会插入这个奇怪的81,我怎么能摆脱它。 谢谢你的帮助

2 个答案:

答案 0 :(得分:3)

这是完全正常的行为。您正在具有命名行的矩阵上应用函数。您的函数返回每行的列表,此新列表列表中的每个元素都使用相应的rowname命名。

以下是重现您所描述的内容的示例:

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

答案 1 :(得分: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

您需要第一个下标来区分每行将生成的列表。我怀疑您的rownames已编号,这会导致您看到$`81`