Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用dplyr获得每组的顶级案例?_R_Dplyr - Fatal编程技术网

如何使用dplyr获得每组的顶级案例?

如何使用dplyr获得每组的顶级案例?,r,dplyr,R,Dplyr,我有一个包含3列的数据表:ID、Type和Count。对于每个ID,我希望得到该ID中计数最多的2个类型,并将结果平铺成一行。例如,如果我的数据表如下所示: ID Type Count A 1 8 B 1 3 A 2 5 A 3 2 B 2 1 B 3 4 ID Top1Type Top1TypeCount Top2Type Top2TypeCount A 1

我有一个包含3列的数据表:ID、Type和Count。对于每个ID,我希望得到该ID中计数最多的2个类型,并将结果平铺成一行。例如,如果我的数据表如下所示:

ID   Type   Count
A    1      8
B    1      3
A    2      5
A    3      2
B    2      1
B    3      4
ID   Top1Type   Top1TypeCount  Top2Type   Top2TypeCount
A    1          8              2          5
B    3          4              1          3
然后我希望我的输出是两行,如下所示:

ID   Type   Count
A    1      8
B    1      3
A    2      5
A    3      2
B    2      1
B    3      4
ID   Top1Type   Top1TypeCount  Top2Type   Top2TypeCount
A    1          8              2          5
B    3          4              1          3

有人能告诉我如何使用R中的dplyr库来实现这一点吗?非常感谢。

最好将数据保存在长/整齐的格式中。要实现这一点,您可以使用:

df1 %>% group_by(ID) %>% top_n(2, Count) %>% arrange(ID)
其中:

      ID  Type Count
  (fctr) (int) (int)
1      A     1     8
2      A     2     5
3      B     1     3
4      B     3     4

当有联系时,可以使用“切片”为每组选择相等数量的观察值:

# some example data
df2 <- structure(list(ID = structure(c(1L, 2L, 1L, 1L, 2L, 2L), .Label = c("A", "B"), class = "factor"), 
                      Type = c(1L, 1L, 2L, 3L, 2L, 3L), 
                      Count = c(8L, 3L, 8L, 8L, 1L, 4L)), 
                 .Names = c("ID", "Type", "Count"), class = "data.frame", row.names = c(NA, -6L))
给出:

      ID  Type Count
  (fctr) (int) (int)
1      A     1     8
2      A     2     8
3      A     3     8
4      B     1     3
5      B     3     4
      ID  Type Count
  (fctr) (int) (int)
1      A     1     8
2      A     2     8
3      B     1     3
4      B     3     4
使用
slice()

给出:

      ID  Type Count
  (fctr) (int) (int)
1      A     1     8
2      A     2     8
3      A     3     8
4      B     1     3
5      B     3     4
      ID  Type Count
  (fctr) (int) (int)
1      A     1     8
2      A     2     8
3      B     1     3
4      B     3     4
使用
arrange
可以确定案例的顺序,从而确定由
slice
选择的案例。以下是:

df2 %>% group_by(ID) %>% top_n(2, Count) %>% arrange(ID, -Type) %>% slice(1:2)
给出以下结果:

      ID  Type Count
  (fctr) (int) (int)
1      A     3     8
2      A     2     8
3      B     3     4
4      B     1     3

使用
data.table
,我们将“data.frame”转换为“data.table”(
setDT(df1)
),按“ID”分组,我们
order
按降序排列“Count”,将前两行(
head(.SD,2)
)。然后,我们创建一个按“ID”分组的序列列(“N”),并从“long”到“wide”
dcast
data.table
dcast
可以包含多个
value.var

library(data.table)#v1.9.6+
DT <- setDT(df1)[order(-Count), head(.SD, 2) , by = ID]
DT[, N:= 1:.N, by = ID]

dcast(DT, ID~paste0('Top', N), 
            value.var=c('Type', 'Count'), fill = 0)
#    ID Type_Top1 Type_Top2 Count_Top1 Count_Top2
#1:  A         1         2          8          5
#2:  B         3         1          4          3
library(data.table)#v1.9.6+

DT使用
top\u n
选择top
n
案例感谢您的帮助。感谢您的帮助akrun,它可以工作感谢Jaap提供的解决方案。通过使用top_n函数,如果计数中有ties,那么将返回所有ties,有没有办法只返回两种类型?@Carter我添加了一个示例,说明如何使用
slice()
,该示例可用于为每个组选择相同数量的案例