以下是原件 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)具有相似的计数.因此,将为此创建两个新的观察结果.
这是一个解决方案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)