【问题标题】:Counting text values across different columns, in to new columns将不同列中的文本值计算到新列中
【发布时间】:2019-05-18 11:14:52
【问题描述】:

编辑 1: 清晰度和错字,更多示例。


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

在新数据集中,重要的是新列(计算来自Action 的单个文本值)链接到Q.Operatie 的值(具有值Q1, Q2, Q3, Q4)和Operatie(@987654333 @)。

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

这会导致 4 (Q1.X:Q4.X) 列,每个列在其尊重范围内都有其唯一的文本值计数。因此,Q1.DelegerendQ2.DelegerendQ3.DelegerendQ4.Delegerend 用于Operatie == 1 的行,用于Delegerend(21 个唯一的一个)。我们可能需要设置“转移矩阵”,从而拆分观察结果。

原始数据示例如下所示,新数据集将在单行中包含每个唯一值的列,请参见原始数据下方的示例。

   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

因此,最终,我希望一行 (Operatie) 有 21 列,频率为该唯一文本(取自列Action),已排序按Q.Operatie 的级别。是的,这会导致很多列,21 个唯一值乘以 4。但这没关系。

   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 制作一个列表,见下​​文。我没能让它流畅地工作。我的印象是可以调用一个列表来计算唯一值,但不确定如何使用dplyr 来编写它。我查看了一些帖子,但找不到任何关于计算多行以将其迁移到新数据集的信息。但是,后者很简单,我只需要列。

my_list <- list(unique(sort(obs_IND$Action)))

obs_IND %>% 
count(my_list) %>%
group_by(Operatie) %>%
tally()

使用来源:

【问题讨论】:

  • 为什么按“四分位”而不是按计数排序?四分位数是基于弦的频率吗?为什么不直接使用 table()?
  • 据我了解您的问题,它仅涉及原始数据框中的两列。请提供仅包含这两列以及产生结果所需的最小行数的示例数据。您说您希望以 21 列结束,但您的示例结果没有 21 列,这令人费解。你没有说 21 是从哪里来的。请解释一下。在一个示例中,如果您将问题更改为需要较小的数字(或仅当您使用 letters 创建示例数据时才更大),那将是很好的。
  • 这个问题有点难理解。会不会是您混淆了“列”和“行”这两个词? Operatie 有 21 个值;因此结果有 21*4 行对吗?
  • @Elin 希望现在更清楚一点,诀窍是转置一点。我希望创建一个包含所有文本值的单行(对于Operatie 的每个值)。
  • .. 包含所有 unique 文本值的计数。

标签: r dplyr


【解决方案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 ...
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多