1

尝试学习 plyr 时,我在尝试从入门指南中复制代码时遇到了困难。

该指南说代码在一个文件plyr.r中,但不是我可以找到这个文件的地方。

但是复制第一个例子似乎很容易,所以我决定试一试:

替代文字

dat <- data.frame(c(10,100,50), mean=c(5,5,10), sd=c(1,2,1))
maply(dat, rnorm)

我得到这个错误:

Error in function (..., na.last = TRUE, decreasing = FALSE)  : 
unimplemented type 'list' in 'orderVector1'

dat <- cbind(c(10,100,50), mean=c(5,5,10), sd=c(1,2,1))
maply(dat, rnorm)

Error: Results must have the same dimensions.

问题:

  1. 我究竟做错了什么?
  2. 我在哪里可以找到 plyr.r?(不在这里
4

1 回答 1

5

您制作的数据框有一个与 rnorm 函数不兼容的标头 (col.names)。看:

> dat <- data.frame(c(10,100,50), mean=c(5,5,10), sd=c(1,2,1))
> dat
  c.10..100..50. mean sd
1             10    5  1
2            100    5  2
3             50   10  1

而 m*pply 函数不知道如何处理 'c.10..100..50...' 列。

正如您在文档 ( ?mdply) 中看到的那样,以下示例就像一个魅力:

> mdply(data.frame(mean = 1:5, sd = 1:5), rnorm, n = 2)
  mean sd         V1         V2
1    1  1 0.09919179  0.6083586
2    2  2 0.92787891 -0.1139743
3    3  3 2.21236781  0.8029677
4    4  4 4.16506428  9.2477373
5    5  5 1.26558507 12.0633377

如果您真的想要使用不同参数的不同数量的观察值,则不应使用 mdply,因为 matrix/data.frame 必须具有相同的列数。安装使用mlply,例如:

> mlply(data.frame(n=1:5, mean = 1:5, sd = 1:5), rnorm)
$`1`
[1] 1.053083

$`2`
[1] -1.650090  2.239547

$`3`
[1] -0.94697908 -1.11479730 -0.03467497

$`4`
[1]  6.427796  1.482655  1.436822 -5.993420

$`5`
[1]  4.557689  6.217015  2.105255 -1.309664 -2.969184

attr(,"split_type")
[1] "array"
attr(,"split_labels")
  n mean sd
1 1    1  1
2 2    2  2
3 3    3  3
4 4    4  4
5 5    5  5
于 2011-01-06T17:27:18.840 回答