我可以完成这个任务,但我觉得必须有一个"最好的"(最简洁,最紧凑,最清晰的代码,最快?)的方式,到目前为止还没有弄清楚...
对于一组指定的分类因素,我想按组构建均值和方差表.
生成数据:
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/ …
以下代码使用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解决方案吗?
我是该revalue函数的粉丝,plyr用于替换字符串.它简单易记.
但是,我已经迁移了dplyr似乎没有revalue功能的新代码.dplyr做以前完成的事情可以接受的习惯是什么revalue?
我反复使用的设计模式之一是在数据帧上执行"分组依据"或"拆分,应用,组合(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) 我有一个包含大约200列的数据框,其中我想要将表格分组前10个左右,这些是因子并将其余列相加.
我有我要分组的所有列名列表以及我想要聚合的所有列的列表.
我正在寻找的输出格式需要是相同数量的cols的相同数据帧,只是组合在一起.
有没有使用包解决方案data.table,plyr或任何其他?
我希望能够将列名发送给我正在进行的通话ddply.一个示例ddply电话:
ddply(myData, .(MyGrouping), summarise, count=sum(myColumnName))
Run Code Online (Sandbox Code Playgroud)
如果我已经ddply包装在另一个函数中,是否可以将其包装起来以便我可以传递一个任意值myColumnName来调用函数?
这更像是一个概念性问题,我没有具体问题.
我学习进行数据分析蟒蛇,但我非常熟悉的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,这是一项值得投资,但问题仍然存在
我正在尝试重命名列,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) 我有定期运行回归的数据.每个"数据块"的数据都适合不同的回归.例如,每个州可能具有解释从属值的不同功能.这似乎是典型的"拆分 - 应用 - 组合"类型的问题,因此我使用的是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中找到惯用的方法来通过某个索引向量对数值向量进行分区,找到该分区中所有数字的总和,然后将每个单独的条目除以该分区总和.换句话说,如果我从这开始:
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等.