如何在分组/汇总时保留列?

时间:2016-08-14 09:34:47

标签: r dplyr

所以,这个问题的问题是,我不能发布实际代码,因为我必须签署一个协议,而且我是R的新人并且可能无法解释那么好,但也许有人可以帮助我...

我们说我有一些数据:

A   B    C   D
F1  6.6  10  10
F1  3.1  10  10
A1  1.0  20  10
B1  3.4  20  20

因此,对于每个A,C和D值是相同的。 但是我想用dplyr找到Bmean就像这样:

A    Bmean   C    D
F1   4,85    10  10
A1   1.0     20  10
B1   3.4     20  20

我该怎么做?我的想法是使用像

这样的东西
dplyr::group_by(A) %>% dplyr::summarize(Bmean = mean(B))

但此操作后C和D似乎消失了。 group_by是否有意义保留所有列? 或者这将如何运作?

为了澄清,我想使用dplyr语法,因为如果可能的话,它是更大操作的一部分。

4 个答案:

答案 0 :(得分:2)

你可以简单地使用这样的东西:

aggregate(cbind(B, C, D) ~ A, df, mean)

这里df是包含A,B,C和D列的数据框。

答案 1 :(得分:2)

您可以使用base R

执行此操作
aggregate(data=df1,B~.,FUN = mean)

答案 2 :(得分:1)

我们可以使用data.table

library(data.table)
setDT(df1)[,.(Bmean = mean(B)) , .(A, C, D)]
#     A  C  D Bmean
#1: F1 10 10  4.85
#2: A1 20 10  1.00
#3: B1 20 20  3.40

答案 3 :(得分:0)

我想添加一个遮篷,专门解决dplyr的使用问题。我敢肯定,这样做的方式更优雅,但以下建议可以在汇总/汇总的数据框中保留带有其他描述性变量的列。同样,如果不是这种情况,该代码将无法保护您免受更大数据框中的错误的侵害。

以下代码删除C和D列

library(dplyr)
library(tibble)

df <- tribble(
  ~A  , ~B , ~c , ~D ,
  "F1", 6.6, 10 , 10 ,
  "F1", 3.1, 10 , 10 ,
  "A1", 1.0, 20 , 10 ,
  "B1", 3.4, 20 , 20
)

以下代码删除C和D列

df %>%
  group_by(A) %>%
  summarise(Bmean = mean(B)) 

此代码保留C和D列。请注意,只有在组的每一行中都有相同的变量时,此方法才有效。但是,由于应该保留这些变量,并且不影响它们的分组行为,因此无论如何都是如此。

df %>%
  group_by(A) %>%
  summarise(Bmean = mean(B),
            C = unique(C),
            D = unique(D))