R 为数据帧中的每个组选择前N行

R 为数据帧中的每个组选择前N行,r,dataframe,R,Dataframe,下面是dataframe的一个示例: Index Country 4.1 USA 2.1 USA 5.2 USA 1.1 Singapore 6.2 Singapore 8.1 Germany 4.5 Italy 7.1 Italy 2.3 Italy 5.9

下面是dataframe的一个示例:

Index        Country

4.1             USA
2.1             USA
5.2             USA
1.1             Singapore
6.2             Singapore
8.1             Germany
4.5             Italy
7.1             Italy
2.3             Italy
5.9             Italy
8.8             Russia
并且,我打算在数据框中为每个国家的获取N个元素。例如,如果N=3,那么我将从每个组中选取3行,如果任何特定组没有像Singapore这样的N个元素,那么它将只选取足够的两个记录,即带有国家标签Singapore。同样的情况也适用于超过N个元素的国家标签,例如意大利,因此它只需要3个元素

对于N=3,输出数据帧为:

Index         Country
4.1             USA
2.1             USA
5.2             USA
1.1             Singapore
6.2             Singapore
8.1             Germany
4.5             Italy
7.1             Italy
2.3             Italy
8.8             Russia
我在想这样的事情:

aggregate(df, by=list(df$Country), head(df, 3))

但它似乎不起作用。

使用
tidyverse
中的
dplyr
包,您可以执行以下操作:

library(tidyverse)

df <- tribble(
    ~Index, ~Country
    , 4.1, "USA"
    , 2.1, "USA"
    , 5.2, "USA"
    , 1.1, "Singapore"
    , 6.2, "Singapore"
    , 8.1, "Germany"
    , 4.5, "Italy"
    , 7.1, "Italy"
    , 2.3, "Italy"
    , 5.9, "Italy"
    , 8.8, "Russia"
)

df %>% # take the dataframe
    group_by(Country) %>% # group it by the grouping variable
    slice(1:3) # and pick rows 1 to 3 per group
库(tidyverse)
df%#获取数据帧
按(国家)分组%>%#按分组变量分组
切片(1:3)#每组挑选1到3行
输出:

   Index Country  
   <dbl> <chr>    
 1   8.1 Germany  
 2   4.5 Italy    
 3   7.1 Italy    
 4   2.3 Italy    
 5   8.8 Russia   
 6   1.1 Singapore
 7   6.2 Singapore
 8   4.1 USA      
 9   2.1 USA      
10   5.2 USA  
索引国家
1 8.1德国
2.4.5意大利
3.7.1意大利
4.2.3意大利
5.8.8俄罗斯
6.1.1新加坡
7.6.2新加坡
8.4.1美国
9.2.1美国
10.5.2美国

这是否回答了您的问题?聚合的“正确”语法应该是
aggregate(df,by=list(df$Country),FUN=head,3)
,但是
aggregate
希望每个组返回一行,所以它会将额外的行作为额外的列添加,所以这并不好。