将不同列中的文本值计数到新列中

时间:2019-05-18 11:14:53

标签: r dplyr


编辑1:清晰度和错别字,进一步扩展了示例。


我有一个数据集,其中的一列(Action)具有文本值。我要计算唯一值(对于给定的Operatie),然后根据它们的ID(== {Operatie)将它们放在新列中。 Action中有21个唯一值。

在新数据集中,重要的一点是将新列(该计数对Action中的单个文本值)链接到Q.Operatie的值(具有值Q1, Q2, Q3, Q4)和Operatie1:100)。

因此,如果我们在示例中采用前4行,那么我们将有一个名为Q1.Delegerend == 2的列。而下一列将是Q1.Goedaardig = =1。因为Delegerend有2次出现的Goedaardig和1次出现的Operation == 1。在此示例中,我忽略了Instruerend

这导致4( Q1.X:Q4.X )列,每个列的文本值唯一计数均在其允许的范围内。因此,Q1.Delegerend的{​​{1}}行的Q2.DelegerendQ3.DelegerendQ4.DelegerendOperatie == 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

使用的来源:

1 个答案:

答案 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)

我们可以按operatieQaction进行分组,然后使用tally()计数实例。

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

现在,我们可以使用函数spreadQaction的每种组合创建带有列的宽数据框:

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 ...
...