Étant donné un dataframe:
a b 1 343 1 54 2 55 2 62 3 59 3 -9 4 0 4 -0.5
Je veux prendre les N dernières observations / lignes de chaque groupe:
df %>% dplyr::group_by(a) %>% dplyr::last(2)
Me donne des résultats erronés .
Je veux que ce soit:
df <- structure(list(a = c(1, 1, 1, 2, 2, 2, 3, 3, 4, 4), b = c(34, 343, 54, 11, 55, 62, 59, -9, 0, -0.5)), row.names = c(NA, -10L ), class = c("tbl_df", "tbl", "data.frame"))
Veuillez indiquer ce qui ne va pas ici?
L'erreur que j'obtiens est:
Erreur dans l'ordre (order_by) [[n]]: indice hors limites
4 Réponses :
Comme il s'agit d'une question spécifique basée sur dplyr
1 ) après le group_by
, utilisez slice code > sur le
row_number()
do.call(rbind, lapply(split(df, df$a), tail, 2))
2 ) Ou utilisez le filtre
depuis dplyr
df[aggregate(c ~ a, transform(df, c = seq_len(nrow(df))), FUN = tail, 2)$c,]
3 ) ou avec do
et tail
by(df, df$a, FUN = tail, 2)
4 ) En plus des méthodes tidyverse
, nous pouvons également utilisez data.table
library(data.table) setDT(df)[df[, .I[tail(seq_len(.N), 2)], a]$V1]
5 ) ou par
de base R
df %>% group_by(a) %>% do(tail(., 2))
6 ) ou avec agrégat
de base R code>
df %>% group_by(a) %>% filter(row_number() >= (n() - 1))
7 ) ou avec split
à partir de base R
library(tidyverse) df %>% group_by(a) %>% slice(tail(row_number(), 2)) # A tibble: 8 x 2 # Groups: a [4] # a b # <dbl> <dbl> #1 1 343 #2 1 54 #3 2 55 #4 2 62 #5 3 59 #6 3 -9 #7 4 0 #8 4 -0.5
Pourquoi pas avec la fonction queue?
@steves Si vous faites df%>% group_by (a)%>% tail (2)
, vous obtiendrez les 2 dernières lignes de l'ensemble de données et non dans le groupe
et last () fonction?
@steves last
est utilisé dans un contexte différent dans sumarise / mutate
pour obtenir le dernier
élément d'une colonne particulière.
Également une possibilité tidyverse
:
df %>% group_by(a) %>% top_n(2, row_number()) a b <dbl> <dbl> 1 1. 343. 2 1. 54.0 3 2. 55.0 4 2. 62.0 5 3. 59.0 6 3. -9.00 7 4. 0. 8 4. -0.500
Il prend les deux premières lignes étant donné les numéros de ligne par groupes.
J'ai besoin des N dernières lignes.
Une option de base R utilisant tapply
consiste à sous-ensembles les deux dernières lignes pour chaque groupe.
df[as.logical(with(df, ave(1:nrow(df), a, FUN = function(x) x %in% tail(x, 2)))), ]
Ou une autre option utilisant ave
df[unlist(tapply(1:nrow(df), df$a, tail, 2)), ] # a b # <dbl> <dbl> #1 1 343 #2 1 54 #3 2 55 #4 2 62 #5 3 59 #6 3 -9 #7 4 0 #8 4 -0.5
try tail (). En R head, la fonction vous permet de prévisualiser les n premières lignes whike tail vous permet de prévisualiser les n dernières lignes
Copie possible de Sélectionnez la première et la dernière ligne parmi les données groupées