我想知道一种将摘要统计信息添加回数据框每一行的方法。
下面的代码有效,但是应该是一种更快的方法,对吧?
library("tidyverse")
data <- (iris)
means <- iris %>%
group_by(Species) %>%
summarise(
Sepal.Length = mean(Sepal.Length),
Sepal.Width = mean(Sepal.Width)
)
data <- merge(data, means, by = "Species")
答案 0 :(得分:1)
您可以使用dplyr::mutate_at
进行此操作:
iris %>% group_by(Species) %>%
mutate_at(.vars = vars(Sepal.Length,Sepal.Width),
.funs = list(mean = ~mean))
我们需要list(mean = ~mean)
位,而不仅仅是.funs = mean
位来重命名列,而不是覆盖原始的列。
# A tibble: 150 x 7
# Groups: Species [3]
Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.Length_mean Sepal.Width_mean
<dbl> <dbl> <dbl> <dbl> <fct> <dbl> <dbl>
1 5.1 3.5 1.4 0.2 setosa 5.01 3.43
2 4.9 3 1.4 0.2 setosa 5.01 3.43
3 4.7 3.2 1.3 0.2 setosa 5.01 3.43
4 4.6 3.1 1.5 0.2 setosa 5.01 3.43
5 5 3.6 1.4 0.2 setosa 5.01 3.43
6 5.4 3.9 1.7 0.4 setosa 5.01 3.43
7 4.6 3.4 1.4 0.3 setosa 5.01 3.43
8 5 3.4 1.5 0.2 setosa 5.01 3.43
9 4.4 2.9 1.4 0.2 setosa 5.01 3.43
10 4.9 3.1 1.5 0.1 setosa 5.01 3.43
答案 1 :(得分:1)
执行此操作的一种方法是使用mutate。
library("tidyverse")
data <- (iris)
data<-data %>%
group_by(Species) %>%
mutate(Sepal.Length.y=mean(Sepal.Length), Sepal.Width.y=mean(Sepal.Width))
因此,这与您之前的操作非常相似,但是减少了一些步骤。如果要重新排列列的顺序,可以对其重新排序。另外,我建议您更改帖子中Sepal.Length和Sepal.Width的列名称,但是如果您不指定唯一名称,则r会在它们上加上.y使其唯一。 希望这会有所帮助。