我刚刚发现了这个伟大的plyr包装并且正在接受它.
我有一个问题如下:是否有一些方法可以从内部访问分组变量d_ply?
说我有一个数据帧df的柱子x,y,z,我想画出每个z值x对y.如果我执行以下操作:
plotxy = function(df, ...) {plot(df$x, df$y, ...)}
d_ply(df, .(z), plotxy(df, main=.(z)))
Run Code Online (Sandbox Code Playgroud)
然后显示在图上的标题都是"z",而不是z变量的值.有没有办法从内部访问这些值d_ply?
编辑:正如@Justin指出的那样,上面的表述是错误的,因为我正在将整个过程传递df给plotxy.因此这条线
d_ply(df, .(z), plotxy(df, main=.(z)))
Run Code Online (Sandbox Code Playgroud)
应该
d_ply(df, .(z), plotxy, main=.(z))
Run Code Online (Sandbox Code Playgroud)
为了理解我原来的问题(我猜这也是@joran所暗示的).
但是,我意识到了别的.即使df沿着被剪切z的d_ply,子非数据帧,该函数接收仍然有z柱-简单地总是相同的值.因此,问题显然可以解决如下:
plotxy = function(df, ...) {plot(df$x, df$y, main=df$z[1])}
d_ply(df, .(z), plotxy)
Run Code Online (Sandbox Code Playgroud)
举例来说,我将扩展Joran的关注点.
df <- data.frame(x=rnorm(100), y=rnorm(100), z=letters[1:10])
Run Code Online (Sandbox Code Playgroud)
让我们使用你的函数,看看我们得到什么没有plyr:
plotxy(df, main=.(z))
Run Code Online (Sandbox Code Playgroud)
可能更期望(?):
plotxy(df, main=df$z)
Run Code Online (Sandbox Code Playgroud)
但是,在代码中,您将在z上拆分数据框,然后再将整个data.frame df发送到您的函数.相反,你可以创建一个包装函数:
d_ply(df, .(z), function(ply.df) plotxy(ply.df, main=unique(ply.df$z)))
Run Code Online (Sandbox Code Playgroud)
这样,该plotxy函数只能看到通过包装函数传递的较小的split data.frame ply.df.