使用R在列中选取每个组内的前N个值

3

我需要在R中从以下数据框中为每个组[yearmonth]值选择前两个值。我已经按计数和年月对数据进行了排序。如何在以下数据中实现这一点?

 yearmonth  name    count
1   201310  Dovas   5
2   201310  Indulgd 2
3   201310  Justina 1
4   201310  Jolita  1
5   201311  Shahrukh Sheikh 1
6   201311  Dovas   29
7   201311  Justina 13
8   201311  Lina    8
9   201312  sUPERED 7
10  201312  John Hansen 7
11  201312  Lina D. 6
12  201312  joanna1st   5

这个回答解决了你的问题吗?[按组选择前N个值] (https://dev59.com/h2Uq5IYBdhLWcg3wF8hQ) - camille
3个回答

7
或者使用 data.table(来自 @jazzurro 帖子的 mydf)。一些选项如下:
  library(data.table)
  setDT(mydf)[order(yearmonth,-count), .SD[1:2], by=yearmonth]

或者

   setDT(mydf)[mydf[order(yearmonth, -count), .I[1:2], by=yearmonth]$V1,]

或者

   setorder(setkey(setDT(mydf), yearmonth), yearmonth, -count)[
                                          ,.SD[1:2], by=yearmonth]
  #    yearmonth        name count
  #1:    201310       Dovas     5
  #2:    201310     Indulgd     2
  #3:    201311       Dovas    29
  #4:    201311     Justina    13
  #5:    201312     sUPERED     7
  #6:    201312 John Hansen     7

@jazzurro 我猜 setorder 会更快一些。 - akrun
明白了,非常感谢。我会把它们和您的评论都记下来。感谢您的慷慨支持。 - jazzurro
@jazzurro 没问题。 - akrun
似乎两种方法都没有考虑到平局的情况。理解这在问题中没有提到。 - KFB
@KFB 我只是在使用示例数据。也许可以使用 rank 并指定 ties.method 来完成。 - akrun

5

以下是一种方法:

library(dplyr)

mydf %>%
    group_by(yearmonth) %>%
    arrange(desc(count)) %>%
    slice(1:2)

#  yearmonth        name count
#1    201310       Dovas     5
#2    201310     Indulgd     2
#3    201311       Dovas    29
#4    201311     Justina    13
#5    201312     sUPERED     7
#6    201312 John Hansen     7

数据

mydf <- data.frame(yearmonth = rep(c("201310", "201311", "201312"), each = 4),
                   name = c("Dovas", "Indulgd", "Justina", "Jolita", "Shahrukh Sheikh",
                         "Dovas", "Justina", "Lina", "sUPERED", "John Hansen",
                         "Lina D.", "joanna1st"),
                   count = c(5,2,1,1,1,29,13,8,7,7,6,5),
                   stringsAsFactors = FALSE)

如何选择通用的前10个? - Curious G.

2

使用基本的R语言,您可以这样做:

# sort the data, skip if already done
df <- df[order(df$yearmonth, df$count, decreasing = TRUE),] 

然后,要获取前两个元素:
df[ave(df$count, df$yearmonth, FUN = seq_along) <= 2, ]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接