Как мне упростить приведенный ниже код при использовании grepl для замены каждой подходящей строки? - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть столбец имени файла (data $ name), перечисленный как:

aaa.doc
aaa.pptx
http://aaa
aaa.jpg
guide
some memo
...

Я хочу, насколько это возможно, заменить их всеми типами, имя без определенного типа файла. Я бы просто пометил его как "другие".

При замене столбца имени файла на тип файла я сделал это:

data$name[grepl("http",data$name,ignore.case = FALSE)]<-"web"
data$name[grepl("pptx",data$name,ignore.case = FALSE)]<-"ppt"
data$name[grepl("pdf",data$name,ignore.case = FALSE)]<-"pdf"
data$name[grepl("txt",data$name,ignore.case = FALSE)]<-"txt"
...

1.Как упростить это или есть лучший способ сделать это?

2.Как заменить имена файлов, которые не соответствуют ни одному из перечисленных мной типов?

Например: если имя файла Руководство Я бы заменил его на "другие".

Спасибо.


Пожалуйста, посмотрите мою проблему:

> d <- structure(list(name = structure(c(1L, 3L, 5L, 2L, 4L, 7L, 6L), .Label = c("aaa.doc", "aaa.jpg", "aaa.pptx", "guide", "http://aaa", "memo", "some"), class = "factor")), class = "data.frame",row.names = c(NA, -7L))
> d
        name
1    aaa.doc
2   aaa.pptx
3 http://aaa
4    aaa.jpg
5      guide
6       some
7       memo
> trans <- c(http = "web", pptx = "ppt", pdf = "pdf", txt = "txt")
> pat <- paste(names(trans), collapse = "|")  # http|pptx|pdf|txt
> strapply(as.character(d$name), pat, ~ trans[x], empty = "others", simplify = TRUE)
[[1]]
NULL

[[2]]
[1] "pptx"

[[3]]
[1] "http"

[[4]]
NULL

[[5]]
NULL

[[6]]
NULL

[[7]]
NULL

Ответы [ 2 ]

1 голос
/ 20 апреля 2019

1) strapply Определить именованный вектор trans, который переводит совпадения в типы.Затем найдите имена trans и переведите каждое из них, используя strapply.

Первый аргумент strapply - это входной символьный вектор, второй - сопоставляемый шаблон, третий - это функция, применяемая к совпадениям, выраженным здесь с использованием формульной нотации, аргумент empty указывает, чтоиспользовать, если совпадения нет, и simplify=TRUE заставляет его выводить простой символьный вектор, а не список.

library(gsubfn)

trans <- c(http = "web", pptx = "ppt", pdf = "pdf", txt = "txt")

pat <- paste(names(trans), collapse = "|")  # http|pptx|pdf|txt
strapply(tolower(d$name), pat, ~ trans[x], empty = "others", simplify = TRUE)
## [1] "others" "ppt"    "web"    "others" "others" "others" "others"

2) База R Используя trans сверху, мыможно создать простой цикл.

result <- result.ini <- tolower(d$name)
for(nm in names(trans)) result[ grepl(nm, result) ] <- trans[nm]
result[ result == result.ini ] <- "others"
result
## [1] "others" "ppt"    "web"    "others" "others" "others" "others"

3) R Base - уменьшить Мы можем использовать Reduce практически так же, как цикл for, но без явного цикла:

Match <- function(result, nm) ifelse(grepl(nm, result), trans[nm], result)
out <- Reduce(Match, names(trans), init = tolower(d$name))
out[out == tolower(d$name)] <- "others"
out
## [1] "others" "ppt"    "web"    "others" "others" "others" "others"

Примечание

Ввод в воспроизводимой форме:

d <- 
structure(list(name = structure(c(1L, 3L, 5L, 2L, 4L, 7L, 6L), .Label = c("aaa.doc", 
"aaa.jpg", "aaa.pptx", "guide", "http://aaa", "memo", "some"), 
class = "factor")), class = "data.frame", row.names = c(NA, -7L))
1 голос
/ 20 апреля 2019
  1. В tidyverse это может выглядеть так, как показано ниже.Вы можете добавить дополнительные параметры в библиотеку case_when()

    (tidyverse)

    data <- tibble (name = c ('aaa.doc', 'aaa.pptx', 'aaa.txt)',' aaa.pdf ',' <a href="http:////aaa" rel="nofollow noreferrer"> http: //// aaa ',' aaa.jpg ',' guide ',' некоторая заметка '))

    data <- data%>% mutate (name = case_when (str_detect (tolower (имя), "http") ~ "web", str_detect (tolower (имя), "pptx") ~ "ppt", str_detect (tolower (имя), "pdf)") ~" pdf ", str_detect (tolower (имя)," txt ") ~" txt ", str_detect (tolower (имя)," guide ") ~" other ", TRUE ~ 'неизвестно'))

  2. ИСТИНА должна быть последней строкой для всех остальных случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...