Создание динамики c Group By - PullRequest
3 голосов
/ 19 июня 2020
df = data.frame(
  A = c(1, 4, 5, 13, 2),
  B = c("Group 1", "Group 3", "Group 2", "Group 1", "Group 2"),
  C = c("Group 3", "Group 2", "Group 1", "Group 2", "Group 3")
)

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

df %>%
  group_by(C) %>%
  summarise(val = mean(A))

Вместо того, чтобы писать новый фрагмент кода для каждого уникального набора group_by, я хотел бы создать al oop, который перебирал бы фрейм данных df и сохранял результаты в списке или фрейм данных.

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

Пробовал:

List_Of_Groups <- map_df(df, function(i) {
  df %>% 
    group_by(!!!syms(names(df)[1:i])) %>% 
    summarize(newValue = mean(A))
})

Ответы [ 3 ]

5 голосов
/ 19 июня 2020

Используя purrr s map, вы можете применить указанный фрагмент кода ко всем символьным столбцам. Обычно вы сопоставляете имена символьных переменных с функцией, которая следует за

purrr::map(names(df %>% select(where(is.character))), function(i) {
  df %>% 
    group_by(!!sym(i)) %>% 
    summarize(newValue = mean(A))
})

Вывод

# [[1]]
# A tibble: 3 x 2
#   B       newValue
#   <chr>      <dbl>
# 1 Group 1      7  
# 2 Group 2      3.5
# 3 Group 3      4  
# 
# [[2]]
# A tibble: 3 x 2
#   C       newValue
#   <chr>      <dbl>
# 1 Group 1      5  
# 2 Group 2      8.5
# 3 Group 3      1.5
2 голосов
/ 19 июня 2020

Вы можете развернуть его долго, используя A в качестве идентификатора, а затем сгруппировать по:

library(tidyr)
df %>% pivot_longer(-A) %>% group_by(name,value) %>% summarize(val=mean(A))
# A tibble: 6 x 3
# Groups:   name [2]
  name  value     val
  <chr> <fct>   <dbl>
1 B     Group 1   7  
2 B     Group 2   3.5
3 B     Group 3   4  
4 C     Group 1   5  
5 C     Group 2   8.5
6 C     Group 3   1.5
1 голос
/ 19 июня 2020

Вы можете попробовать что-то вроде этого:

library(dplyr)
empty_list <- list(0)
for(i in 2:dim(df)[2])
{
  empty_list[[i-1]]<-df %>% group_by(df[,i]) %>% summarise(val = mean(A))
}
empty_list

[[1]]
# A tibble: 3 x 2
  `df[, i]`   val
  <fct>           <dbl>
1 Group 1           7  
2 Group 2           3.5
3 Group 3           4  

[[2]]
# A tibble: 3 x 2
  `df[, i]`   val
  <fct>           <dbl>
1 Group 1           5  
2 Group 2           8.5
3 Group 3           1.5

Надеюсь, это поможет.

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