J'ai cette colonne, Identifier avec des valeurs de caractères.

structure(list(Identifier = c("RL.K", "RL.K.1", "RL.K.2", "RL.K.3", 
"RL.K.4", "RL.K.5", "RL.K.6", "RL.K.7", "RL.K.9", "RL.K.10", 
"RI.K", "RI.K.1", "RI.K.2", "RI.K.3", "RI.K.4", "RI.K.5", "RI.K.6", 
"RI.K.7", "RI.K.9", "RI.K.10", "RF.K", "RF.K.1")), row.names = c(NA, 
-22L), class = c("tbl_df", "tbl", "data.frame"))

Comment filtrer les valeurs avec une seule période? pour que je puisse supprimer les lignes 1, 11 et 21

1
user8248672 20 nov. 2018 à 20:43

4 réponses

Meilleure réponse

Nous pouvons compter le nombre de . dans 'Identifier' et créer une condition logique pour filter les lignes

library(tidyverse)
df1 %>% 
   filter(str_count(Identifier, "[.]") == 1)
# A tibble: 3 x 1
#  Identifier
#  <chr>     
#1 RL.K      
#2 RI.K      
#3 RF.K      

Ou comme @WiktorStribizew l'a mentionné, fixed peut être enveloppé pour le rendre plus rapide

df1 %>% 
   filter(str_count(Identifier, fixed(".")) == 1)

Ou sans utiliser de bibliothèques externes,

df1[nchar(gsub("[^.]*", "", df1$Identifier)) == 1,]

Ou en utilisant gregexpr de base R

df1[lengths(gregexpr(".", df1$Identifier, fixed = TRUE)) == 1,]
1
akrun 20 nov. 2018 à 18:12

Si nous allons utiliser base et grepl, il existe un code regex plus simple:

df[grepl("\\..*\\.", df$Identifier),]

(explication de l'expression régulière: \\. trouve un littéral., .* trouve n'importe quoi, donc ce code trouve les cas où il y a deux points littéraux séparés par n'importe quoi)

2
iod 20 nov. 2018 à 17:58

Une solution utilisant la base R. (trouver toutes les chaînes avec exactement un point)

grepl("^[^.]*[.][^.]*$", df1$Identifier)

Pour supprimer les lignes avec un point, utilisez:

df1[
!grepl("^[^.]*[.][^.]*$", df1$Identifier),
]
2
Andre Elrico 22 nov. 2018 à 11:11

Avec le moins de Regex possible;):

has.only.one.dot <- function(str_vec) sapply(strsplit(str_vec, "\\."), function(vec) length(vec) == 2)
df[!has.only.one.dot(df$Identifier), ]

Cependant, les fonctions de liste sapply et strsplit sont plus lentes que la solution regex.

has.only.one.dot <- function(str_vec) grepl("\\.", str_vec) & ! grepl("\\..*\\.", str_vec)
df[!has.only.one.dot(df$Identifier), ]
0
Gwang-Jin Kim 20 nov. 2018 à 18:11