试图学习plyr,我一直试图从介绍性指南中重现代码.
该指南说代码在一个文件中plyr.r,但不是我能找到这个文件的地方.
但是复制第一个例子中的一个似乎很容易,所以我决定尝试一下:

dat <- data.frame(c(10,100,50), mean=c(5,5,10), sd=c(1,2,1))
maply(dat, rnorm)
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Error in function (..., na.last = TRUE, decreasing = FALSE) :
unimplemented type 'list' in 'orderVector1'
Run Code Online (Sandbox Code Playgroud)
试
dat <- cbind(c(10,100,50), mean=c(5,5,10), sd=c(1,2,1))
maply(dat, rnorm)
Run Code Online (Sandbox Code Playgroud)
给
Error: Results must have the same dimensions.
Run Code Online (Sandbox Code Playgroud)
问题:
您创建的数据框有一个标题(col.names),它与rnorm函数不兼容.看到:
> 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
Run Code Online (Sandbox Code Playgroud)
并且m*pply函数不知道如何处理'c.10..100..50 ...'列.
正如您在docs(?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
Run Code Online (Sandbox Code Playgroud)
如果您确实需要使用不同参数的不同观察次数,则不应使用mdply,因为matrix/data.frame必须具有相同的列数.Insted use 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
Run Code Online (Sandbox Code Playgroud)