R список первых n записей в кадре данных по фактору или целому числу - PullRequest
3 голосов
/ 12 апреля 2019

Я хотел бы перечислить верхние n записей в кадре данных для каждого уровня фактора или целого числа. Вот код, который у меня есть:

index <- c(1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3)
prob <- runif(20,0,1)

x.df <- data.frame(cbind(index,prob))
x.df <- x.df[order(x.df$index,-x.df$prob),]

head(x.df[x.df$index==1,],n=3)
head(x.df[x.df$index==2,],n=3)
head(x.df[x.df$index==3,],n=3)

Это делает работу, но я бы не хотел явно указывать заголовок для каждого уровня / целого числа. Спасибо.

Ответы [ 4 ]

2 голосов
/ 12 апреля 2019

В базе R есть групповой метод, называемый tapply:

with(x.df, stack(tapply(prob, index, head, 3)))
#     values ind
#1 0.9045300   1
#2 0.7651376   1
#3 0.3631891   1
#4 0.9471318   2
#5 0.9206743   2
#6 0.7675069   2
#7 0.9866379   3
#8 0.9149754   3
#9 0.7862320   3

И есть также функция by для data.frame:

do.call(rbind, by(x.df, index, head, 3))

, котораядает тот же результат

1 голос
/ 12 апреля 2019

Простое решение, используя data.table пакет-

> setDT(x.df)[,head(.SD,3),by=index]

Выход -

index      prob
1:     1 0.7863076
2:     1 0.7103228
3:     1 0.5657803
4:     2 0.9939695
5:     2 0.7517839
6:     2 0.7348664
7:     3 0.9260537
8:     3 0.5889305
9:     3 0.5557626

Примечание - Если ваш probне заказано, тогда используйте это-

> setDT(x.df)[order(-prob),head(.SD,3),by=index]
1 голос
/ 12 апреля 2019

При условии, что он неупорядочен

  x.df %>%           
      group_by(index) %>% 
      top_n(3) %>%
      ungroup()
1 голос
/ 12 апреля 2019

Предполагая, что ваш фрейм данных расположен в нужном вам порядке, вы можете сделать это:

library(dplyr)

x.df %>%
  group_by(index) %>%  # for each index
  slice(1:3) %>%       # get top 3 rows
  ungroup()            # forget the grouping

# # A tibble: 9 x 2
#   index  prob
#   <dbl> <dbl>
# 1     1 0.943
# 2     1 0.461
# 3     1 0.251
# 4     2 0.739
# 5     2 0.697
# 6     2 0.695
# 7     3 0.968
# 8     3 0.915
# 9     3 0.635
...