标签: plyr

快速/优雅的方法来构建均值/方差汇总表

我可以完成这个任务,但我觉得必须有一个"最好的"(最简洁,最紧凑,最清晰的代码,最快?)的方式,到目前为止还没有弄清楚...

对于一组指定的分类因素,我想按组构建均值和方差表.

生成数据:

set.seed(1001)
d <- expand.grid(f1=LETTERS[1:3],f2=letters[1:3],
                 f3=factor(as.character(as.roman(1:3))),rep=1:4)
d$y <- runif(nrow(d))
d$z <- rnorm(nrow(d))
Run Code Online (Sandbox Code Playgroud)

期望的输出:

  f1 f2  f3    y.mean      y.var
1  A  a   I 0.6502307 0.09537958
2  A  a  II 0.4876630 0.11079670
3  A  a III 0.3102926 0.20280568
4  A  b   I 0.3914084 0.05869310
5  A  b  II 0.5257355 0.21863126
6  A  b III 0.3356860 0.07943314
... etc. ...
Run Code Online (Sandbox Code Playgroud)

使用aggregate/ merge:

library(reshape)
m1 <- aggregate(y~f1*f2*f3,data=d,FUN=mean)
m2 <- aggregate(y~f1*f2*f3,data=d,FUN=var)
mvtab <- merge(rename(m1,c(y="y.mean")),
      rename(m2,c(y="y.var")))
Run Code Online (Sandbox Code Playgroud)

使用ddply/ …

aggregate r plyr reshape2

21
推荐指数
5
解决办法
1万
查看次数

使用stat_summary的标准误差条

以下代码使用Hmisc,ddply和ggplot生成带有标准误差条的条形图:

means_se <- ddply(mtcars,.(cyl),
                  function(df) smean.sdl(df$qsec,mult=sqrt(length(df$qsec))^-1))
colnames(means_se) <- c("cyl","mean","lower","upper")
ggplot(means_se,aes(cyl,mean,ymax=upper,ymin=lower,group=1)) + 
  geom_bar(stat="identity") +  
  geom_errorbar()
Run Code Online (Sandbox Code Playgroud)

但是,使用诸如mean_sdl之类的辅助函数实现上述功能似乎要好得多.例如,以下代码生成具有95%CI错误条的图:

ggplot(mtcars, aes(cyl, qsec)) + 
  stat_summary(fun.y = mean, geom = "bar") + 
  stat_summary(fun.data = mean_sdl, geom = "errorbar")
Run Code Online (Sandbox Code Playgroud)

我的问题是如何使用stat_summary实现标准误差条.问题是要计算SE,你需要每个条件的观测数量,这必须在mean_sdl的乘数中访问.

如何在ggplot中访问此信息?对此有一个简洁的非hacky解决方案吗?

r ggplot2 plyr

20
推荐指数
1
解决办法
4万
查看次数

使用dplyr时,是否有替代plyr的"重估"功能?

我是该revalue函数的粉丝,plyr用于替换字符串.它简单易记.

但是,我已经迁移了dplyr似乎没有revalue功能的新代码.dplyr做以前完成的事情可以接受的习惯是什么revalue

string r plyr dplyr

20
推荐指数
2
解决办法
1万
查看次数

将聚合值连接回原始数据框

我反复使用的设计模式之一是在数据帧上执行"分组依据"或"拆分,应用,组合(SAC)",然后将聚合数据连接回原始数据.例如,当计算每个县与具有许多州和县的数据框中的州平均值的偏差时,这很有用.我的总计算很少只是一个简单的意思,但它就是一个很好的例子.我经常通过以下方式解决这个问题:

require(plyr)
set.seed(1)

## set up some data
group1 <- rep(1:3, 4)
group2 <- sample(c("A","B","C"), 12, rep=TRUE) 
values <- rnorm(12)
df <- data.frame(group1, group2, values)

## got some data, so let's aggregate

group1Mean <- ddply( df, "group1", function(x) 
                     data.frame( meanValue = mean(x$values) ) )
df <- merge( df, group1Mean )
df
Run Code Online (Sandbox Code Playgroud)

这产生了如下的良好聚合数据:

> df
   group1 group2   values meanValue
1       1      A  0.48743 -0.121033
2       1      A -0.04493 -0.121033
3       1      C -0.62124 -0.121033
4       1      C -0.30539 -0.121033
5       2 …
Run Code Online (Sandbox Code Playgroud)

r plyr

19
推荐指数
4
解决办法
4512
查看次数

按多列分组并汇总其他多列

我有一个包含大约200列的数据框,其中我想要将表格分组前10个左右,这些是因子并将其余列相加.

我有我要分组的所有列名列表以及我想要聚合的所有列的列表.

我正在寻找的输出格式需要是相同数量的cols的相同数据帧,只是组合在一起.

有没有使用包解决方案data.table,plyr或任何其他?

grouping aggregate r plyr data.table

19
推荐指数
6
解决办法
6万
查看次数

从列名发送到函数的ddply

我希望能够将列名发送给我正在进行的通话ddply.一个示例ddply电话:

ddply(myData, .(MyGrouping), summarise, count=sum(myColumnName))
Run Code Online (Sandbox Code Playgroud)

如果我已经ddply包装在另一个函数中,是否可以将其包装起来以便我可以传递一个任意值myColumnName来调用函数?

r plyr

19
推荐指数
2
解决办法
2883
查看次数

Python中的plyr或dplyr

这更像是一个概念性问题,我没有具体问题.

我学习进行数据分析蟒蛇,但我非常熟悉的R - 的关于R的伟大的事情之一是plyr(当然GGPLOT2的),甚至更好dplyr.Pandas当然也有分裂应用,但是在RI中可以做一些事情(在dplyr中,在plyr中有点不同,我现在可以看到dplyr是如何模仿对象编程的.符号)

   data %.% group_by(c(.....)) %.% summarise(new1 = ...., new2 = ...., ..... newn=....)
Run Code Online (Sandbox Code Playgroud)

我在其中同时创建多个汇总计算

我怎么在python中这样做,因为

df[...].groupby(.....).sum() only sums columns, 
Run Code Online (Sandbox Code Playgroud)

而在RI上,一次通话可以有一个均值,一个和,一个特殊函数等

我意识到我可以单独完成所有操作并合并它们,如果我使用的是python,那就没问题了,但是当选择工具时,你不需要键入和检查和验证的任何代码行都会增加时间

另外,在dplyr中你也可以添加mutate语句,所以在我看来它更强大 - 所以我对pandas或python缺少什么 -

我的目标是学习,我花了很多精力学习python,这是一项值得投资,但问题仍然存在

python r plyr pandas dplyr

19
推荐指数
4
解决办法
1万
查看次数

dplyr rename - 错误:`new_name` = old_name必须是符号或字符串,而不是公式

我正在尝试重命名列,dplyr::rename()R正在返回此错误,我无法在网上找到任何地方.

Error: `new_name` = old_name must be a symbol or a string, not formula

具有2列数据框的可重现示例:

library(dplyr)
df <- data.frame(old_name = seq(1:10), x = seq(1:10))
df %>% dplyr::rename(new_name = old_name)
Run Code Online (Sandbox Code Playgroud)

会话信息:

> sessionInfo()
R version 3.4.3 (2017-11-30)
Platform: x86_64-apple-darwin17.2.0 (64-bit)
Running under: macOS High Sierra 10.13.1

Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] dplyr_0.7.4

loaded via a namespace (and not attached): …
Run Code Online (Sandbox Code Playgroud)

r rename plyr dplyr rlang

19
推荐指数
2
解决办法
2961
查看次数

使用带有lm()对象列表的predict

我有定期运行回归的数据.每个"数据块"的数据都适合不同的回归.例如,每个州可能具有解释从属值的不同功能.这似乎是典型的"拆分 - 应用 - 组合"类型的问题,因此我使用的是plyr包.我可以轻松创建一个lm()运行良好的对象列表.但是,我不能完全理解我以后如何使用这些对象来预测单独data.frame中的值.

这是一个完全人为的例子,说明了我正在尝试做的事情:

# setting up some fake data
set.seed(1)
funct <- function(myState, myYear){
   rnorm(1, 100, 500) +  myState + (100 * myYear) 
}
state <- 50:60
year <- 10:40
myData <- expand.grid( year, state)
names(myData) <- c("year","state")
myData$value <- apply(myData, 1, function(x) funct(x[2], x[1]))
## ok, done with the fake data generation. 

require(plyr)

modelList <- dlply(myData, "state", function(x) lm(value ~ year, data=x))
## if you want to see the summaries of the lm() do …
Run Code Online (Sandbox Code Playgroud)

r predict plyr lm

18
推荐指数
3
解决办法
5725
查看次数

用于通过索引对矢量进行分区并对该分区执行操作的惯用R代码

我试图在R中找到惯用的方法来通过某个索引向量对数值向量进行分区,找到该分区中所有数字的总和,然后将每个单独的条目除以该分区总和.换句话说,如果我从这开始:

df <- data.frame(x = c(1,2,3,4,5,6), index = c('a', 'a', 'b', 'b', 'c', 'c'))
Run Code Online (Sandbox Code Playgroud)

我希望输出创建一个向量(让我们称之为z):

c(1/(1+2), 2/(1+2), 3/(3+4), 3/(3+4), 5/(5+6), 6/(5+6))  
Run Code Online (Sandbox Code Playgroud)

如果我这样做是SQL并且可以使用窗口函数,我会这样做:

select 
 x / sum(x) over (partition by index) as z 
from df
Run Code Online (Sandbox Code Playgroud)

如果我使用plyr,我会做这样的事情:

ddply(df, .(index), transform, z = x / sum(x))
Run Code Online (Sandbox Code Playgroud)

但我想知道如何使用标准的R函数编程工具,如mapply/aggregate等.

functional-programming r plyr

18
推荐指数
3
解决办法
2432
查看次数