1
votes

Supprimer les 10 premières et les 10 dernières valeurs

J'ai un fichier qui contient plusieurs individus et plusieurs valeurs pour le même individu. Je dois supprimer les 10 premières et les 10 dernières valeurs de chaque individu, en mettant toutes les valeurs restantes dans une nouvelle table.

Voici à quoi ressemblent mes données:

Cow        Data   
NL123456   123
NL123456   456

J'ai essayé de faire une boucle for, en comptant par individu combien de valeurs il y avait (mais je pense que je suis déjà coincé là-bas, parce que je n'utilise pas la bonne commande je pense? Toutes les variables de Cow sont un facteur). J'ai pensé que supprimer le premier et le dernier devait être quelque chose comme ceci: data1 [c (11: n-10),]

r

4 commentaires

Pouvez-vous mettre un exemple de vos données en utilisant la fonction dput () ? dput (head (data1, 50))


avez-vous toujours plus de 20 valeurs?


Jetez un œil à la fonction head . Si vous publiez un exemple reproductible , nous serons en mesure de vous aider davantage


Comment déterminez-vous les 10 premières et les 10 dernières observations? Est-ce basé sur l'ordre dans lequel ils apparaissent dans les données? Il serait utile de savoir si vous avez un autre champ, dites identifiant d’observation , dans lequel vous pouvez «ordonner» les données.


3 Réponses :


3
votes

Si vous savez que vous avez toujours plus de 20 points de données par vache, vous pouvez faire ce qui suit, illustré sur le jeu de données iris :

iris_trimmed <- do.call(
  rbind, 
  lapply(split(iris, iris$Species),
         function(x) head(tail(x,-10),-10)))

dim(iris_trimmed)
# [1] 90  5

Sur vos données:

res <-
  your_data %>%
  group_by(Cow) %>%
  slice(11:(n()-10)) %>%
  ungroup()

Dans la base R, vous pouvez faire:

library(dplyr)

dim(iris)
# [1] 150   5

iris_trimmed <-
  iris %>%
  group_by(Species) %>%
  slice(11:(n()-10)) %>%
  ungroup()

dim(iris_trimmed)
# [1] 90  5


0 commentaires

0
votes

Voici une solution avec dplyr .

Dans mon exemple, je ne coupe que les première et dernière valeurs. (vous pouvez l'adapter en changeant 2 avec n'importe quel nombre dans filter).

L'idée est d'ajouter après avoir group_by id le nombre de lignes par chaque observation en commençant par le haut ( n ) et en sens inverse par le bas ( n1 ), il vous suffit de filtrer.

set.seed(123)
data <- data.frame(id = c(rep(1,4), rep(2,4)), value=sample(8))
data
#   id value
# 1  1     3
# 2  1     6
# 3  1     8
# 4  1     5
# 5  2     4
# 6  2     1
# 7  2     2
# 8  2     7


3 commentaires

n'oubliez pas de dissocier pour éviter les mauvaises surprises :)


et supprimez le groupe de la sortie :)


Votre solution avec slice est de toute façon plus simple. +1



1
votes

Utilisation de data.table:

do.call(
  rbind, 
  lapply(
    split(iris, iris[["Species"]]), 
    function(x) x[11:(nrow(x)-10), ]
  )
)

Même logique dans base R :

library(data.table)
idt <- as.data.table(iris)
idt[, .SD[11:(.N-10)], Species]


0 commentaires