1
votes

Supprimer les points qui se répètent consécutivement plus de n fois

J'ai un grand ensemble de données avec des points X et Y. Je veux l'animer, donc je veux supprimer les points qui sont des emplacements fixes.Je voudrais supprimer les lignes où les mêmes X et Y sont répétés plus de n fois.

Jusqu'à présent, j'ai fait cela, y a-t-il plus solution élégante? Merci!

uniques <- unique(data[c("Lat","Long")])
uniques$values = row.names(uniques)
uniques2 <- inner_join(data,uniques,by=c("Lat","Long"))
reps <- data.frame(unclass(rle(uniques2$values)))
delete <- as.character(reps$values[(reps$lengths)>10])
data2 <- uniques2[! uniques2$values %in% delete),]

r

2 commentaires

Besoin de données et de clarifications concernant "X" et "Y" (vraisemblablement Lat "et" long ").


Vous devriez probablement coller les valeurs ensemble pour créer un vecteur à analyser avec rle.


3 Réponses :


1
votes

En utilisant data.table , je vais essayer cette solution en une seule ligne:

library(data.table)
data < as.data.table(data)[, count:=.N, by=.(Lat,Long)][count<n][,count:=NULL]

Meilleur!


0 commentaires

3
votes

Tidyverse-way serait

data2 <- data %>%
  group_by(Long, Lat) %>%
  filter(n() <= 10) %>%
  ungroup()


1 commentaires

Cette solution suppose que les emplacements ne sont pas revisités.



1
votes

En supposant que vous souhaitiez conserver la première des lignes où x et y commencent à se répéter, vous pouvez essayer l'approche suivante avec le dplyr package:

library(dplyr)

# Example data
df <- data.frame(
  x = c(rep(1, 5), 2:6, rep(7, 5)),
  y = c(rep(9, 5), 2:6, rep(8, 5))
)

# Cut-off value
n <- 3

# Remove unwanted rows
new_df <- df %>% 
  mutate(same_as_prev = x == lag(x) & y == lag(y)) %>% 
  group_by(x, y, same_as_prev) %>% 
  mutate(consec_count = n()) %>% 
  filter(consec_count <= n & same_as_prev) %>%
  ungroup()


0 commentaires