我可以完成这个任务,但我觉得必须有一个"最好的"(最简洁,最紧凑,最清晰的代码,最快?)的方式,到目前为止还没有弄清楚...
对于一组指定的分类因素,我想按组构建均值和方差表.
生成数据:
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/ …
我有一个包含两列(年份和降水)的数据框。在单列中,年份被列出,从 1900 年开始,到 2014 年结束,再次从 1900 年开始。在另一列中,我有相应年份的降水值。现在我想将 1900 年的所有降水量添加为 1 个值,将 1901 年的所有降水量添加为 1 到 2014 年。我的数据如下所示:
Year Precipitation
1900 4.826
1901 37.592
2014 14.224
1900 45.974
1901 46.228
2014 79.502
1900 52.578
1901 22.30
2014 15.25
Run Code Online (Sandbox Code Playgroud)
结果应如下所示:
Year Precipitation
1900 103.378
1901 106.12
2014 108.976
Run Code Online (Sandbox Code Playgroud)
到目前为止我写了一个代码但它不起作用,如果有人可以修复它吗?
data=read.table('precipitation.csv',header=T,sep=',')
frame=data.frame(data)
cumcum=tapply(frame$Precipitation, cumsum(frame$year==1), FUN=sum, na.rm=TRUE)
Run Code Online (Sandbox Code Playgroud)
谢谢
继我的问题之后:
1.确定一组变量是否唯一地标识数据的每一行;
2. 根据给定的变量集标记所有重复的行,
我现在想通过获取它们的总和,根据给定的变量集合来汇总/合并所有重复的行.
关于如何在这里执行此操作有一些指导,但是当存在构成索引的大量变量级别时,ddply推荐的方法很慢,因为在我尝试标记所有重复项的情况下通过一组给定的变量.
# Values of (f1, f2, f3, f4) uniquely identify observations
dfUnique = expand.grid(f1 = factor(1:16),
f2 = factor(1:41),
f3 = factor(1:2),
f4 = factor(1:104))
# sample some extra rows and rbind them
dfDup = rbind(dfUnique, dfUnique[sample(1:nrow(dfUnique), 100), ])
# dummy data
dfDup$data = rnorm(nrow(dfDup))
# aggregate the duplicate rows by taking the sum
dfDupAgg = ddply(dfDup, .(f1, f2, f3, f4), summarise, data = sum(data))
Run Code Online (Sandbox Code Playgroud)
第二个解决方案是使用data.table,并遵循 …
我有一个有点愚蠢的问题.如果我有一个矩阵(或数据框,哪个更容易使用),如:
Year Match
2008 1808
2008 137088
2008 1
2008 56846
2007 2704
2007 169876
2007 75750
2006 2639
2006 193990
2006 2
Run Code Online (Sandbox Code Playgroud)
而且我想总结这些年来的每一场比赛(所以,例如,2008年的比赛是这样的,2008 195743我将如何做到这一点?我脑子里有一些解决方案,但它们都是不必要的复杂和R趋势有一些更简单的解决方案隐藏在某个地方.
您可以使用以下内容生成相同的矩阵:
structure(c(2008L, 2008L, 2008L, 2008L, 2007L, 2007L, 2007L,
2006L, 2006L, 2006L, 1808L, 137088L, 1L, 56846L, 2704L, 169876L,
75750L, 2639L, 193990L, 2L), .Dim = c(10L, 2L), .Dimnames = list(
NULL, c("Year", "Match")))
Run Code Online (Sandbox Code Playgroud)
谢谢你尽你所能的帮助.