Как в R извлечь весь текст до левой скобки? - PullRequest
3 голосов
/ 27 мая 2020

В столбце Winner моего фрейма данных я хочу удалить весь текст, начиная с левой круглой скобки.

При поиске на stackoverflow.com я нашел этот ответ и применил его stringr в моем коде, но оно не работает. Мой код не меняет вводимые данные.

Я был бы признателен за помощь с этой проблемой.

Ввод:

Year    Lg  Winner                  Team
1956    NL  Don Newcombe (1 | MVP)  Brooklyn (1)
1957    NL  Warren Spahn (1 | HOF | ASG)    Milwaukee (1)
1958    AL  Bob Turley (1 | ASG)    New York (1)

Вот как я хочу, чтобы результат выглядел:

Year    Lg  Winner                  Team
1956    NL  Don Newcombe            Brooklyn (1)
1957    NL  Warren Spahn            Milwaukee (1)
1958    AL  Bob Turley              New York (1)

dput (dfx):

structure(list(Year = 1956:1958, Lg = structure(c(2L, 2L, 1L), .Label = c("AL", 
"NL"), class = "factor"), Winner = structure(c(2L, 3L, 1L), .Label = c("Bob Turley (1 | ASG)", 
"Don Newcombe (1 | MVP)", "Warren Spahn (1 | HOF | ASG)"
), class = "factor"), Team = structure(1:3, .Label = c("Brooklyn (1)", 
"Milwaukee (1)", "New York (1)"), class = "factor")), class = "data.frame", row.names = c(NA, 
-3L))

Код:

library(stringr)
dfnoparens <- dfx
str_replace(dfnoparens$Winner, " \\(.*\\)", "")
head(dfnoparens)

Ответы [ 4 ]

3 голосов
/ 27 мая 2020

Мы можем использовать trimws с whitespace

 trimws(x, whitespace = "\\s*\\(.*")
 #[1] "Don Newcombe" "Warren Spahn" "Bob Turley"  

data

x <- c('Don Newcombe (1 | MVP)', 'Warren Spahn (1 | HOF | ASG)', 'Bob Turley (1 | ASG)')
3 голосов
/ 27 мая 2020

С тестовыми данными в вопросе (только соответствующий столбец).

x <- c('Don Newcombe (1 | MVP)', 'Warren Spahn (1 | HOF | ASG)', 'Bob Turley (1 | ASG)')

Используйте regexpr/regmatches.

m <- regexpr('^[^\\(]*', x)
y <- regmatches(x, m)
y
#[1] "Don Newcombe " "Warren Spahn " "Bob Turley "

Эти выходные строки по-прежнему имеют пробел перед левым круглые скобки, при необходимости удалите их сейчас.

trimws(y)
#[1] "Don Newcombe" "Warren Spahn" "Bob Turley"
1 голос
/ 27 мая 2020

Используйте str_extract из библиотеки stringr:

df$Winner <- str_extract(df$Winner, ".*(?=\\s\\(\\d)")

Это решение использует положительный просмотр вперед в (?=...); опережающий просмотр можно обозначить как «Сопоставить все (.*), которое встречается до пробела (\\s), за которым следует открывающая круглая скобка (\\(), за которой следует число (\\d)».

Результат:

df
  Year Lg       Winner          Team
1 1956 NL Don Newcombe  Brooklyn (1)
2 1957 NL Warren Spahn Milwaukee (1)
3 1958 AL   Bob Turley  New York (1)
1 голос
/ 27 мая 2020
df <- structure(list(Year = 1956:1958, 
                     Lg = structure(c(2L, 2L, 1L), .Label = c("AL", "NL"), class = "factor"), 
                     Winner = structure(c(2L, 3L, 1L), 
                                        .Label = c("Bob Turley (1 | ASG)", "Don Newcombe (1 | MVP)", 
                                                   "Warren Spahn (1 | HOF | ASG)"), class = "factor"),
                     Team = structure(1:3, .Label = c("Brooklyn (1)", "Milwaukee (1)", "New York (1)"), 
                                      class = "factor")), class = "data.frame", row.names = c(NA,-3L))

Вот решение strsplit.

df$Winner <- unlist(lapply(strsplit(as.character(df$Winner)," (",fixed=TRUE), `[[`, 1))
df
  Year Lg       Winner          Team
1 1956 NL Don Newcombe  Brooklyn (1)
2 1957 NL Warren Spahn Milwaukee (1)
3 1958 AL   Bob Turley  New York (1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...