Свертывание суммирующих строк в сочетании со столбцами - PullRequest
0 голосов
/ 27 июня 2019

Из-за некоторого кодирования набор данных слишком упорядочен. Я хотел бы сохранить столбцы, но хотел бы суммировать каждое действие (= 21 уникальных терминов). Для того, чтобы он помещался в одну строку, которая подсчитывает вхождения в каждом квартиле (Q) процедуры.

Цель состоит в том, чтобы подсчитывать предикторы для каждого случая Q. Данные сортируются по 21 действию, 4 Q и 100 процедурам. В целом счет присутствует, мы хотим разрезать на 4 части (время).

Я также не против подсчета всех действий с удалением Q в качестве столбца.

Я хочу получить это, или это то, что я ожидаю от результата:

   procedure`action 1 Q1` `action 1 Q2` `action 2 Q1` `action 2 Q2`
    <dbl>         <dbl>         <dbl>         <dbl>         <dbl>
 1   1             4             2             2             3
 2   2             2             2             1             5
 3   3             ..            ..            ..            ..

Но мой фрейм данных выглядит так:

   Q     procedure `action 1 Q1` `action 1 Q2` `action 2 Q1` `action 2 Q2`
   <fct>    <dbl>         <dbl>         <dbl>         <dbl>         <dbl>
 1 Q1           1             4             0             0             0
 2 Q1           1             0             0             2             0
 3 Q1           1             0             0             0             0
 4 Q1           1             0             0             0             0
 5 Q2           1             0             2             0             0
 6 Q2           1             0             0             0             3
 7 Q2           1             0             0             0             0
 8 Q2           1             0             0             0             0
 9 Q1           2             2             0             0             0
10 Q1           2             0             0             1             0
11 Q1           2             0             0             0             0
12 Q1           2             0             0             0             0
13 Q2           2             0             2             0             0
14 Q2           2             0             0             0             5
15 Q2           2             0             0             0             0
16 Q2           2             0             0             0             0
# ... with 4 more variables: `action 3 Q1` <dbl>, `action 3 Q2` <dbl>, `action 4
#   Q1` <dbl>, `action 4 Q2` <dbl>

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

procedure <- rep(c(rep(1,10), rep(2,10)),2)
Q <- rep(rep(c(rep('Q1',5),rep('Q2',5)),2),2)
action <- rep(rep(paste('action', 1:4),5),2)
df <- data.frame(procedure, Q, action)

library(dplyr)
library(tidyr)

# We can group by procedure, Q and action, and then count the instance with tally().

df_long <- df %>% group_by(procedure, Q, action) %>% tally()
df_long$action.Q <- paste(df_long$action,df_long$Q)

# Now we can use the function spread to create wide dataframe with columns for each combination of Q and action:

df_wide <- df_long %>% spread(action.Q, n, fill=0) %>% select(-c(Q,action))

df_long выглядит так (после paste(action.Q)):

# A tibble: 10 x 5
# Groups:   procedure, Q [3]
   procedure Q     action       n action.Q   
      <dbl> <fct> <fct>    <int> <chr>      
 1        1 Q1    action 1     4 action 1 Q1
 2        1 Q1    action 2     2 action 2 Q1
 3        1 Q1    action 3     2 action 3 Q1
 4        1 Q1    action 4     2 action 4 Q1
 5        1 Q2    action 1     2 action 1 Q2
 6        1 Q2    action 2     4 action 2 Q2
 7        1 Q2    action 3     2 action 3 Q2
 8        1 Q2    action 4     2 action 4 Q2
 9        2 Q1    action 1     2 action 1 Q1
10        2 Q1    action 2     2 action 2 Q1

Источник: Подсчет текстовых значений в разных столбцах, в новых столбцах

1 Ответ

0 голосов
/ 27 июня 2019

Я уверен, что есть лучшие способы, но начиная с того места, где вы оставили:

df_wide <- df_long %>% spread(action.Q, n, fill=0)
df_wide %>%
  group_by(procedure) %>%
  summarize(`action 1 Q1` = sum(`action 1 Q1`), `action 1 Q2` = sum(`action 1 Q2`), `action 2 Q1` = sum(`action 2 Q1`), `action 2 Q2` = sum(`action 2 Q2`))

Обратите внимание, что я изменил operatie на procedure в вашем наборе данных.

РЕДАКТИРОВАТЬ: Благодаря Ронак Шах, вы можете сделать summarize менее ручным способом:

df_wide %>%
  group_by(procedure) %>%
  summarize_at(vars(starts_with("action ")), sum)

Обратите внимание на «пробел» после действия, чтобы избежать совпадения с самим столбцом action.

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