在R中获得分组结果

在R中获得分组结果,r,grouping,sas,anova,R,Grouping,Sas,Anova,这里我有如下数据集。 在SAS系统中,为了在我所做的任何事情(如平均值、GLM或REG)中获得分组结果,我可以将其连接为: proc sort; by B; proc glm; class A; model C=A; by B; run; 然后,我可以在B级或B级内获得GLM结果。 但是,我不知道如何在R系统中使用like'by'来分组。 您可能想建议我使用>subset(),但是,当您有10个级别的B时,这种连接将非常困难。 你可能想了解我,但不仅要了解方差分析,还要了解回归和平均值。 有人

这里我有如下数据集。 在SAS系统中,为了在我所做的任何事情(如平均值、GLM或REG)中获得分组结果,我可以将其连接为:

proc sort; by B;
proc glm;
class A;
model C=A; by B;
run;
然后,我可以在B级或B级内获得GLM结果。 但是,我不知道如何在R系统中使用like'by'来分组。 您可能想建议我使用>subset(),但是,当您有10个级别的B时,这种连接将非常困难。 你可能想了解我,但不仅要了解方差分析,还要了解回归和平均值。 有人来帮我吗

raw data

A   B   C
a   a   0.47
a   b   0.88
a   c   2.32
a   d   3.26
a   a   0.93
a   b   1.86
a   c   3.22
a   d   0.92
a   a   0.45
a   b   0.92
a   c   2.31
a   d   3.24
b   a   0.91
b   b   1.84
b   c   3.27
b   d   0.86
b   a   0.47
b   b   0.90
b   c   2.33
b   d   3.19
b   a   0.92
b   b   1.84
b   c   3.25
b   d   0.93
c   a   0.45
c   b   0.92
c   c   2.33
c   d   3.08
c   a   0.93
c   b   1.86
c   c   3.25
c   d   0.93
c   a   0.47
c   b   0.90
c   c   2.26
c   d   3.09

也许聚合函数就是你要找的

aggregate(data$C, by=list(data$A), FUN=sum)

这将按第一列对数据进行分组,并将C列折叠为第一列中每个组的总和

使数据集更易于导入R:

dat <-
structure(list(A = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("a", 
"b", "c"), class = "factor"), B = structure(c(1L, 2L, 3L, 4L, 
1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 
1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L
), .Label = c("a", "b", "c", "d"), class = "factor"), C = c(0.47, 
0.88, 2.32, 3.26, 0.93, 1.86, 3.22, 0.92, 0.45, 0.92, 2.31, 3.24, 
0.91, 1.84, 3.27, 0.86, 0.47, 0.9, 2.33, 3.19, 0.92, 1.84, 3.25, 
0.93, 0.45, 0.92, 2.33, 3.08, 0.93, 1.86, 3.25, 0.93, 0.47, 0.9, 
2.26, 3.09)), .Names = c("A", "B", "C"), class = "data.frame", row.names = c(NA, 
-36L))
同时从所有模型中提取信息遵循相同的范例:

> ldply(models, coefficients)
  B (Intercept)         Ab            Ac
1 a   0.6166667  0.1500000  6.798700e-17
2 b   1.2200000  0.3066667  6.666667e-03
3 c   2.6166667  0.3333333 -3.333333e-03
4 d   2.4733333 -0.8133333 -1.066667e-01

基于@Brian Diggs的答案,但使用R基函数。我还使用了Brian的数据集

models <- lapply(split(dat, dat$B), function(x) glm(C~A, data=x)) 
do.call(rbind, lapply(models, function(y) y$coef))
  (Intercept)         Ab            Ac
a   0.6166667  0.1500000  1.802585e-17
b   1.2200000  0.3066667  6.666667e-03
c   2.6166667  0.3333333 -3.333333e-03
d   2.4733333 -0.8133333 -1.066667e-01

模型非常感谢您,Brian,但我仍然想知道,当您导入数据集时,您可能需要连接read.table,因为您可以控制大量数据。有了你的建议,真的很感谢,但是,不容易控制大数据量。我真的不知道我问的是不是有脐带。@LimHyungwoo我想“脐带”不是你的意思。Brian为导入设置数据的方式非常适合制作一个简短、可复制的示例,因为它可以复制/粘贴到R中。参见@LimHyungwoo我也被“cord”搞糊涂了,但我展示的不是我通常如何将数据读取到R中。事实上,我在您提供的文本上使用了
read.table
,以获得该data.frame。正如@shujaa所说,我将其包括在内是为了制作一个易于复制的示例(也就是说,为了快速回答特定问题,而不是花时间导入数据)。有关将数据导入R的方法,请参阅“R数据导入/导出”(随R提供或在网站上提供)。@BrianDiggs和shujaa,谢谢你们。你的主要建议是我可以使用plyr和Idply软件包。干杯,谢谢,这是非常清楚的。但是,你认为我能在那里找到p值吗?
> ldply(models, coefficients)
  B (Intercept)         Ab            Ac
1 a   0.6166667  0.1500000  6.798700e-17
2 b   1.2200000  0.3066667  6.666667e-03
3 c   2.6166667  0.3333333 -3.333333e-03
4 d   2.4733333 -0.8133333 -1.066667e-01
models <- lapply(split(dat, dat$B), function(x) glm(C~A, data=x)) 
do.call(rbind, lapply(models, function(y) y$coef))
  (Intercept)         Ab            Ac
a   0.6166667  0.1500000  1.802585e-17
b   1.2200000  0.3066667  6.666667e-03
c   2.6166667  0.3333333 -3.333333e-03
d   2.4733333 -0.8133333 -1.066667e-01
models <- lapply(split(dat, dat$B), function(x) glm(C~A, data=x)) #the same as above 
Coef <- lapply(models, function(y) y$coef) # the same as above
Pval <-  lapply(models, function(z) summary(z)$coefficients[, 'Pr(>|t|)'])
Result <- cbind(do.call(rbind, Coef), do.call(rbind, Pval))
colnames(Result)[4:6] <- paste('P.val', colnames(Result)[4:6])
Result

 (Intercept)         Ab            Ac P.val (Intercept)  P.val Ab  P.val Ac
a   0.6166667  0.1500000  1.802585e-17       0.007088207 0.5167724 1.0000000
b   1.2200000  0.3066667  6.666667e-03       0.008446002 0.5191737 0.9886090
c   2.6166667  0.3333333 -3.333333e-03       0.000151772 0.4762936 0.9941859
d   2.4733333 -0.8133333 -1.066667e-01       0.016803317 0.4744404 0.9235623
models <- lapply(split(dat, dat$B), function(x) glm(C~A, data=x)) #the same as above
do.call(rbind, lapply(models, function(z) summary(z)$coefficients))
                 Estimate Std. Error       t value    Pr(>|t|)
(Intercept)  6.166667e-01  0.1540202  4.003804e+00 0.007088207
Ab           1.500000e-01  0.2178175  6.886500e-01 0.516772358
Ac           1.802585e-17  0.2178175  8.275668e-17 1.000000000
(Intercept)  1.220000e+00  0.3167661  3.851423e+00 0.008446002
Ab           3.066667e-01  0.4479749  6.845622e-01 0.519173660
Ac           6.666667e-03  0.4479749  1.488179e-02 0.988608995
(Intercept)  2.616667e+00  0.3103164  8.432253e+00 0.000151772
Ab           3.333333e-01  0.4388537  7.595545e-01 0.476293582
Ac          -3.333333e-03  0.4388537 -7.595545e-03 0.994185937
(Intercept)  2.473333e+00  0.7538543  3.280917e+00 0.016803317
Ab          -8.133333e-01  1.0661110 -7.628974e-01 0.474440418
Ac          -1.066667e-01  1.0661110 -1.000521e-01 0.923562285