Перебирать столбцы и значения строк (список) в R dplyr - PullRequest
0 голосов
/ 28 мая 2018

Этот вопрос основан на следующем сообщении с дополнительными требованиями ( Перебирать столбцы в dplyr? ).

Исходный код выглядит следующим образом:

df <- data.frame(col1 = rep(1, 15),
      col2 = rep(2, 15),
      col3 = rep(3, 15),
      group = c(rep("A", 5), rep("B", 5), rep("C", 5)))

for(col in c("col1", "col2", "col3")){
      filt.df <- df %>%
      filter(group == "A") %>% 
      select_(.dots = c('group', col))
      # do other things, like ggplotting
      print(filt.df)
}

Моя цель - вывести таблицу частот для каждой уникальной комбинации COL по GROUP.В текущем примере указывается фильтр dplyr, основанный на значении GROUP A, B или C. В моем случае я хочу выполнить итерацию (цикл) по списку значений в GROUP (list <- c ("A", "B")., "C") и сгенерируйте таблицу частот для каждой комбинации. </p>

Таблица частот основана на счетах. Для Col1 результат будет выглядеть примерно так, как показано в таблице ниже. Пример набора данных упрощен. Мой реальный набор данныхявляется более сложным с несколькими «значениями» на «группу». Мне нужно перебрать Col1-Col3 по группам.

значение группы n prop
A 1 5 .1
B 2 5 .1
C 3 5 .1

Вот лучший пример таблицы частот: Как использовать dplyr для генерации таблицы частот

Я боролся с этим дляпару дней, и я мог бы сделать лучше с моим примером. Спасибо за посты. Вот то, что я в конечном итоге сделал, чтобы решить эту проблему. В результате ряд таблиц частот для каждого столбца и каждого уникального значения, найденного в группе. Iимел 3 столбца (col1, col2, col3) и 3 уникальныхзначения в группе (A, B, C), 3х3.Результатом являются 9 частотных таблиц и частотная таблица для каждого значения группы, которое не имеет смысла.Я уверен, что есть лучший способ сделать это.Вывод генерирует некоторую маркировку, которая полезна.

# Build unique group list
group <- unique(df$group)

# Generate frequency tables via a loop
iterate_by_group <- function(x)
 for (i in 1:length(group)){ 
  filt.df <- df[df$group==group[i],]
  print(lapply(filt.df, freq))
}

# Run 
iterate_by_group(df)

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Мы могли бы gather в длинный формат и затем получить частоту (n()) по группе

library(tidyverse)
gather(df, value, val, col1:col3) %>%
        group_by(group, value = parse_number(value)) %>% 
        summarise(n = n(), prop = n/nrow(.))
# A tibble: 9 x 4
# Groups:   group [?]
#  group value     n  prop
#  <fct> <dbl> <int> <dbl>
#1 A         1     5 0.111
#2 A         2     5 0.111
#3 A         3     5 0.111
#4 B         1     5 0.111
#5 B         2     5 0.111
#6 B         3     5 0.111
#7 C         1     5 0.111
#8 C         2     5 0.111
#9 C         3     5 0.111
0 голосов
/ 28 мая 2018

Это то, что вы хотите?

df %>%
  group_by(group) %>%
  summarise_all(funs(freq = sum))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...