我使用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
,我怎么能摆脱它。
谢谢你的帮助
答案 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`
。