Использование group_by для суммирования данных во время цикла - PullRequest
0 голосов
/ 11 февраля 2020

Например, вот мой df:

GP_A <- c(rep("a",3),rep("b",2),rep("c",2))
GP_B <- c(rep("d",2),rep("e",4),rep("f",1))
GENDER <- c(rep("M",4),rep("F",3))
LOC <- c(rep("HK",2),rep("UK",3),rep("JP",2))
SCORE <- c(50,70,80,20,30,80,90)
df <- data.frame(GP_A,GP_B,GENDER,LOC,SCORE)

> df

GP_A GP_B GENDER LOC SCORE
1    a    d      M  HK    50
2    a    d      M  HK    70
3    a    e      M  UK    80
4    b    e      M  UK    20
5    b    e      F  UK    30
6    c    e      F  JP    80
7    c    f      F  JP    90

Что я хочу:

result[[GP_A]] <- df %>% group_by(GP_A,GENDER,LOC) %>% summarize(SCORE=mean(SCORE))
result[[GP_B]] <- df %>% group_by(GP_B,GENDER,LOC) %>% summarize(SCORE=mean(SCORE))
...

Я пробовал:

result <- list()
for (i in c("GP_A","GP_B")){
result[[i]] <- df %>% group_by(i,GENDER,LOC) %>% summarize(SCORE=mean(SCORE))
}

Вот ошибка:

Ошибка: столбец I неизвестен

Я также пытался использовать setNames, т.е.

... %>% group_by(setNames(nm=i),GENDER,LOC) %>% ...

Но это также не не работает ...

1 Ответ

0 голосов
/ 16 февраля 2020

Функция group_by_at() позволяет группировать по строковым входам и, вероятно, является лучшим вариантом здесь.

GP_A <- c(rep("a",3),rep("b",2),rep("c",2))
GP_B <- c(rep("d",2),rep("e",4),rep("f",1))
GENDER <- c(rep("M",4),rep("F",3))
LOC <- c(rep("HK",2),rep("UK",3),rep("JP",2))
SCORE <- c(50,70,80,20,30,80,90)
df <- data.frame(GP_A,GP_B,GENDER,LOC,SCORE)

result <- list()

for(i in c("GP_A","GP_B"))
{
  result[[i]] <- 
    df %>% 
      group_by_at(c(i,"GENDER", "LOC")) %>% 
      summarise(SCORE = mean(SCORE)) %>% 
      ungroup()
}

Помните, что всегда лучше ungroup() ваших переменных, как только вы закончите sh , Это сделано для того, чтобы в будущем у вас не было нежелательных уровней группировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...