Отфильтровать все строки только с одним периодом в R - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть этот столбец, Identifier с символьными значениями.

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"))

Как отфильтровать значения только с одним периодом?чтобы я мог вынуть строки 1, 11 и 21

Ответы [ 4 ]

0 голосов
/ 20 ноября 2018

С как можно меньшим количеством регулярных выражений;):

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

Однако функции списка sapply и strsplit работают медленнее, чем решение регулярных выражений.

has.only.one.dot <- function(str_vec) grepl("\\.", str_vec) & ! grepl("\\..*\\.", str_vec)
df[!has.only.one.dot(df$Identifier), ]
0 голосов
/ 20 ноября 2018

Решение с использованием базы R. (найти все строки с одной точкой)

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

Для удаления строк с одной точкой используйте:

df1[
!grepl("^[^.]*[.][^.]*$", df1$Identifier),
]
0 голосов
/ 20 ноября 2018

Если мы собираемся использовать base и grepl, есть более простой код регулярного выражения:

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

(объяснение регулярному выражению: \\. находит литерал., .* находит что-либо, поэтомуэтот код находит случаи, когда две буквальные точки разделены чем-либо)

0 голосов
/ 20 ноября 2018

Мы можем посчитать число . в «Идентификаторе» и создать логическое условие для filter строк

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

Или, как упомянуто @WiktorStribizew, fixed можно обернутьчтобы сделать его более быстрым

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

Или без использования каких-либо внешних библиотек,

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

Или используя gregexpr из base R

df1[lengths(gregexpr(".", df1$Identifier, fixed = TRUE)) == 1,]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...