2017-02-17 64 views
1

У меня есть простой data.frame который выглядит следующим образом:Использование dplyr для суммирования значений и хранения в качестве вектора в фрейме данных?

Group  Person Score_1 Score_2 Score_3 
1   1  90  80  79 
1   2  74  83  28 
1   3  74  94  89 
2   1  33   9   8 
2   2  94  32  78 
2   3  50  90  87 

мне нужно сначала нужно найти среднее Score_1, разрушающийся через человек в группе (т.е. Score_1 означает для группы 1, Score_1 означает для группы 2 и т. Д.), А затем мне нужно свернуть все обе группы, чтобы найти среднее значение Score_1. Как я могу рассчитать эти значения и сохранить их как отдельные объекты? Я использовал функцию «обобщать» в dplyr, со следующим кодом:

summarise(group_by(data,Group),mean(bias,na.rm=TRUE)) 

Я хотел бы, чтобы в конечном счете создать 6-й столбец, который дает среднее значение, повторяется через лиц для каждой группы, а затем седьмому столбца, дает грандиозное значение для всех групп.

Я уверен, что есть другие способы сделать это, и я открыт для предложений (хотя мне все равно хотелось бы знать, как это сделать в dplyr). Благодаря!

+2

Вы должны 'mutate' вместо' summarise' – akrun

ответ

1

Чтобы создать столбец, мы используем mutate, а не summarise. Мы получаем великое среднего (MeanScore1), затем сгруппированных по «Group», получить mean группы («MeanScorebyGroup») и, наконец, заказать колонки с select

library(dplyr) 
df1 %>% 
    mutate(MeanScore1 = mean(Score_1)) %>% 
    group_by(Group) %>% 
    mutate(MeanScorebyGroup = mean(Score_1)) %>% 
    select(1:5, 7, 6) 

Но это также может быть сделано используя base R простым способом

df1$MeanScorebyGroup <- with(df1, ave(Score_1, Group)) 
df1$MeanScore1 <- mean(df1$Score_1) 
+0

@Oryx Рад помочь вам Вы также можете проверить [здесь] (HTTP: // stackoverflow.com/help/someone-answers) – akrun

2

data.table хорош для таких задач, как это:

library(data.table) 

dt <- read.table(text = "Group  Person Score_1 Score_2 Score_3 
      1   1  90  80  79 
      1   2  74  83  28 
      1   3  74  94  89 
      2   1  33   9   8 
      2   2  94  32  78 
      2   3  50  90  87", header = T) 

dt <- data.table(dt) 

# Mean by group 
dt[, score.1.mean.by.group := mean(Score_1), by = .(Group)] 
# Grand mean 
dt[, score.1.mean := mean(Score_1)] 
dt 
0

@akrun вы просто взорвали мой разум!

Просто чтобы прояснить, что вы сказали, вот моя интерпретация:

library(plyr) 

Group <- c(1,1,1,2,2,2) 
Person <- c(1,2,3,1,2,3) 
Score_1 <- c(90,74,74,33,94,50) 
Score_2 <- c(80,83,94,9,32,90) 
Score_3 <- c(79,28,89,8,78,87) 

df <- data.frame(cbind(Group, Person, Score_1, Score_2, Score_3)) 

df2 <- ddply(df, .(Group), mutate, meanScore = mean(Score_1, na.rm=T)) 
mutate(df2, meanScoreAll=mean(meanScore))