折叠汇总行和合​​并列

时间:2019-06-27 10:43:48

标签: r dplyr

由于某些编码,数据集过分排序。我想保留这些列,但想总结每个Action(= 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

来源:Counting text values across different columns, in to new columns

1 个答案:

答案 0 :(得分:0)

我确定还有更好的方法,但是请从您离开的地方开始

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

编辑:感谢罗纳克·沙(Ronak Shah),您可以以较少的手动方式执行summarize

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

请注意操作后的“空格”,以避免与action列本身匹配。