合并相似(但不相等)的行并计算R

时间:2016-08-01 18:04:58

标签: r variables dataframe grouping categorical-data

我有以下数据框('mydf'):

ID   Type   Count  Mark
U1     A     50     R1
U1     A     50     R3
U1     A     50     R4
U1     A     50     R3
U2     B     24     R2
U2     B     24     R5
U3     A     88     R1

每行包含4个变量:

  • ID :用户的ID。

  • 输入:用户的类型,分类,并且对于具有该ID的所有行都是一致的。

  • 计数:用户的计数,连续,并且对于具有该ID的所有行都是一致的。

  • 标记:15个分类符号中的一个,可能因不同而异 具有相同ID的行。

目前,每个标记出现一行,因此每个ID有多行。

不同ID(4-50之间)的标记数不同。

我需要做什么:

  1. 将具有相同ID的行合并为一行,其中包含所有一致信息(类型/计数),以及为该ID显示的所有标记的列表(或计数)。此列表需要反映每个标记对该ID的显示频率(例如,如果单个ID出现两次相同的标记,则需要反映出来,如第2行和第4行中的U1所示)。

    < / LI>
  2. 计算每个ID显示的每个标记的时间。

  3. 计算每个ID的总分数。

  4. 只要存在2和3中描述的计数,就不需要列出每个ID的标记(参见下面的预期输出)。

    预期输出(大约)

    ID   Type   Count  Mark_R1 Mark_R2 Mark_R3 Mark_R4 Mark_R5 Mark_Total
    U1     A     50       1       0       2       1       0       3
    U2     B     24       0       1       0       0       1       2
    U3     A     88       1       0       0       0       0       1
    

    感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我们可以使用dplyr

library(dplyr)
library(tidyr)
mydf %>%
     count(ID, Type, Count, Mark) %>%
     spread(Mark, n, fill = 0) %>%
     ungroup() %>% 
     mutate(Total = rowSums(.[grep("R\\d+", names(.))]))
#     ID  Type Count    R1    R2    R3    R4    R5 Total
#   <chr> <chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1    U1     A    50     1     0     2     1     0     4
#2    U2     B    24     0     1     0     0     1     2
#3    U3     A    88     1     0     0     0     0     1