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),]
3 Réponses :
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
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
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
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]
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 davantageComment 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.