计算使用R按两个不同列分组的列中出现的次数

x1c*_*bon -4 r count

以下是原件 data.frame

ID   Date       Type
123  2011-Jan   A
123  2011-Jan   A
123  2011-Jan   A
123  2011-Jan   B
123  2011-Jan   B
123  2011-Jan   C
123  2011-Mar   X
123  2011-Mar   X
345  2011-Jan   A
345  2011-Jan   A
345  2011-Jan   X
345  2011-Jan   X
456  2011-Mar   Y
789  2011-Mar   z
Run Code Online (Sandbox Code Playgroud)

所需的输出有5个新列,它们将分别具有列类型(Type_1)的第1个最大计数,列类型的第2个最大计数(Type_2).以下是所需的输出

ID   Date       Type_1  Type_2  Type_3  Type_4  Type_5
123  2011-Jan   A       B       C       NA      NA
123  2011-Mar   X       NA      NA      NA      NA
345  2011-Jan   A       NA      NA      NA      NA
345  2011-Jan   X       NA      NA      NA      NA
456  2011-Mar   Y       NA      NA      NA      NA
789  2011-Mar   z       NA      NA      NA      NA
Run Code Online (Sandbox Code Playgroud)

在一个案例中,关于ID-345和Date-2011-Jan.实际上有两种类型(A和X)具有相似的计数.因此,将为此创建两个新的观察结果.

Mic*_*ico 6

这是一个解决方案data.table:

library(data.table)
setDT(x)[,{x<-table(Type)
  as.list(names(x[order(-x)])[1:5])},by=.(ID,Date)]

    ID     Date Type_1 Type_2 Type_3 Type_4 Type_5
1: 123 2011-Jan      A      B      C     NA     NA
2: 123 2011-Mar      X     NA     NA     NA     NA
3: 345 2011-Jan      A      X     NA     NA     NA
4: 456 2011-Mar      Y     NA     NA     NA     NA
5: 789 2011-Mar      z     NA     NA     NA     NA
Run Code Online (Sandbox Code Playgroud)

其基本思想是,你想要的是排序的名称table每个内产生ID- Date对.我们[1:5]用来强制切断任何更长的表,并填写任何更短的表NA.我个人经常需要处理已排序的表,所以我写了一个生成排序表的函数,在这种情况下,这可以做得更干净,只需一行 - 也许是锻炼你的印章.

也可以dcast这样做:

dcast(x[,.N,by=.(ID,Date,Type)][order(ID,Date,-N),
                                I:=paste0("Type_",1:.N),
                                by=.(ID,Date)],
      ID+Date~I,value.var="Type")

    ID     Date Type_1 Type_2 Type_3
1: 123 2011-Jan      A      B      C
2: 123 2011-Mar      X     NA     NA
3: 345 2011-Jan      A      X     NA
4: 456 2011-Mar      Y     NA     NA
5: 789 2011-Mar      z     NA     NA
Run Code Online (Sandbox Code Playgroud)

  • 我觉得你的未来会有一个逆转徽章! (2认同)