由于某些编码,数据集过分排序。我想保留这些列,但想总结每个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
答案 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
列本身匹配。