编辑1:清晰度和错别字,进一步扩展了示例。
我有一个数据集,其中的一列(Action
)具有文本值。我要计算唯一值(对于给定的Operatie
),然后根据它们的ID(== {Operatie
)将它们放在新列中。 Action
中有21个唯一值。
在新数据集中,重要的一点是将新列(该计数对Action
中的单个文本值)链接到Q.Operatie
的值(具有值Q1, Q2, Q3, Q4
)和Operatie
(1:100
)。
因此,如果我们在示例中采用前4行,那么我们将有一个名为Q1.Delegerend
== 2的列。而下一列将是Q1.Goedaardig
= =1。因为Delegerend
有2次出现的Goedaardig
和1次出现的Operation == 1
。在此示例中,我忽略了Instruerend
。
这导致4( Q1.X:Q4.X )列,每个列的文本值唯一计数均在其允许的范围内。因此,Q1.Delegerend
的{{1}}行的Q2.Delegerend
,Q3.Delegerend
,Q4.Delegerend
,Operatie == 1
(21个唯一值之一)。我们可能需要建立“转移矩阵”,从而将观察结果拆分。
原始数据的示例如下所示,新数据集将在单个行中包含每个唯一值的列,请参见原始数据下方的示例。
Delegerend
因此,最终,我想将一行( Operatie )排成21列,并以该唯一文本的频率(取自 Action 列)进行排序按 Operatie Tijdstip Berekening.voor.D Minuut.van.de.Operatie Berekening.voor.F Q.Operatie Actor Responder Action Focus InterTeam
1 1 08:44:56 00:00 1 1% Q1 C OA Delegerend 1 b
2 1 08:45:43 00:00 2 2% Q1 C* AM Goedaardig 1 a
3 1 08:46:45 00:01 3 4% Q1 OA OA* Instruerend 3
4 1 08:47:10 00:02 3 4% Q1 C OA* Delegerend 1 b
5 1 08:48:03 00:03 4 6% Q1 C Team Onderwijzend 1 b
6 1 08:48:44 00:03 5 7% Q1 C Team Bewustwording 1 b
7 1 08:49:28 00:04 6 8% Q1 C* C Instruerend 1 b
8 1 08:50:30 00:05 7 9% Q1 C C* Onderwijzend 1 b
9 1 08:50:47 00:05 7 10% Q1 C AM Delegerend 1 a
10 1 08:51:47 00:06 8 11% Q1 C OA Instruerend 1 b
的级别。是的,这将导致很多列,21个唯一值乘以4。但这很好。
Q.Operatie
因此,我尝试列出了dplyr可以使用的列表,请参见下文。我没有设法使其流畅地工作。我的印象是,可以调用列表来计算唯一值,而不用知道如何使用 Operatie Minuten Chirurg1 Chirurg2 Q1.Delegerend Q2.Delegerend Q3.Delegerend Q4.Delegerend Q1.Goedaardig
1 1 72 10 11 2 4 5 5
2 2 30 10 11 2 2 6 12
3 3 102 1 2 1 5 12 ...
4 4 212 2 NA 3 13 13
5 5 37 4 NA 1 2 ...
6 6 57 2 NA 3 9
7 7 120 3 NA 1 9
8 8 146 3 NA 1 6
9 9 143 2 9 3 10
10 10 189 9 2 3 12
来写出来。我看了几篇文章,但找不到关于计数多行以将其迁移到新数据集的任何信息。但是,后者很容易,我只需要这些列即可。
dplyr
使用的来源:
答案 0 :(得分:1)
我创建了一些示例数据:
operatie <- 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(operatie, Q, action)
library(dplyr)
library(tidyr)
我们可以按operatie
,Q
和action
进行分组,然后使用tally()计数实例。
df_long <- df %>% group_by(operatie, Q, action) %>% tally()
df_long$action.Q <- paste(df_long$action,df_long$Q)
现在,我们可以使用函数spread
为Q
和action
的每种组合创建带有列的宽数据框:
df_wide <- df_long %>% spread(action.Q, n, fill=0) %>% select(-c(Q,action))
结果
Q operatie `action 1 Q1` `action 1 Q2` `action 2 Q1` ...
<fct> <dbl> <dbl> <dbl> <dbl> ...
1 Q1 1 4 0 0 ...
2 Q1 1 0 0 2 ...
3 Q1 1 0 0 0 ...
4 Q1 1 0 0 0 ...
5 Q2 1 0 2 0 ...
6 Q2 1 0 0 0 ...
...