Как указать не только разделитель, но и его положение (как вы можете сделать в SQL) для отдельной функции в R? - PullRequest
1 голос
/ 19 апреля 2020

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

Вот код:

imdb_ratings <-  imdb_ratings %>% separate(col = title, into = c("title", "year"), 
                                           sep = "\\(*[:digit:]")

Очевидно, выдает ошибку, что все значения в столбце года - NA. Я уже знаю, что мой код пытается использовать скобку и число в качестве разделителей (я думаю, вы можете иметь только один символ), но я не знаю, как указать, где должна быть скобка. Я пытался использовать что-то вроде этого "\\(?=[:digit:]", но это также не работает.

[ОБНОВЛЕНИЕ]

Вот мой код сейчас:

imdb_ratings <- imdb_ratings %>%   filter(Animation == 1 & !str_detect(title, "\\$")) %>% 
                                   separate(col = title, into = c("title", "year"),  
                                            sep = "\\((?=\\d)") 

Я хотел отфильтровать строки, заканчивающиеся backsla sh потому что я знаю, что у них нет года, поэтому я использовал код !str_detect(title, "\\$"), но он не работает, потому что после того, как я его отфильтровал, результаты приходят с теми же строками, которые имеют обратную косую черту sh в конце: [! [введите описание изображения Ион здесь] [1]] [1]

[ОБНОВЛЕНИЕ2] Как использовать отдельную функцию для получения года MOV ie во втором столбце в случаях, когда после скобки нет год, но какой-то символ строки. На скриншоте вы можете увидеть пример «Aladdin (Видеоигра 1993)» Что делать, чтобы разделить Aladdin в первом столбце и 1993 в втором столбце? Возможно, вариант будет заключаться в том, чтобы видеоигра была заключена в квадратные скобки в первом столбце.

[! [Введите описание изображения здесь] [2]] [2]

[ОБНОВЛЕНИЕ] Регулярное выражение Строка работала все время, но теперь внезапно R выдает ошибку.

Код не был изменен:

imdb <- imdb %>%  extract(title, c("title", "year"), 
                          "^(.*?)(?:\s*\([^()]*?(\d{4})[^()]*\))?$") 

the error: Error in drop && length(x) == 1L : invalid 'x' type in 'x && y'

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Если вы планируете разбить строку на символе (, за которым следует ди git, вы можете использовать

\((?=\d)

См. Демонстрационную версию regex . Он соответствует ( с \(, а положительный прогноз (?=\d) требует наличия di git непосредственно справа от текущего местоположения.

Чтобы проверить, является ли последний символ строки является бэкслой sh, вы можете использовать "\\\\$", \\$, шаблон. См. regex demo .

В вашем случае вы можете использовать его как

imdb_ratings <- imdb_ratings 
       %>% filter(Animation == 1 & !str_detect(title, "\\\\$")) 
       %>% separate(col = title, into = c("title", "year"), sep = "\\((?=\\d)") 
0 голосов
/ 19 апреля 2020

Мы можем использовать здесь регулярное выражение

library(dplyr)
library(tidyr)
imdb_ratings %>%
     separate(col = title, into = c("title", "year"), 
                                       sep = "\\(?=[[:digit:]])")

Если нам нужно отфильтровать строки, заканчивающиеся на \, тогда выполните filter

imdb_ratings  %>%
        filter(substring(title, nchar(title)) != '"')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...