Разделите символьную переменную на два столбца - PullRequest
1 голос
/ 06 августа 2020

Я извлек некоторые данные из URL, чтобы проанализировать результаты езды на велосипеде. К сожалению, столбец имени содержит имя и название команды в одном поле. Я хотел бы извлечь их друг из друга. Вот код (последняя часть не работает)

#get url
stradebianchi_2020 <- read_html("https://www.procyclingstats.com/race/strade-bianche/2020/result")

#scrape table 
results_2020 <- stradebianchi_2020%>%
  html_nodes("td")%>%
  html_text()

#transpose scraped data into dataframe
results_stradebianchi_2020 <- as.data.frame(t(matrix(results_2020, 8, byrow = F)))

#rename
names(results_stradebianchi_2020) <- c("rank", "#", "name", "age", "team", "UCI point", "PCS points", "time")

#split rider from team

separate(data = results_stradebianchi_2020, col = name, into = c("left", "right"), sep = " ")

Я думаю, что лучший вариант - получить имя переменной команды и использовать это имя, чтобы удалить его из столбца 'name'.

Все предложения приветствуются!

Ответы [ 2 ]

2 голосов
/ 06 августа 2020

Думаю, ваш запрос сформулирован неверно. Вы хотите удалить team из name.

Вот как вы должны это сделать, на мой взгляд:

results_stradebianchi_2020 %>% 
    mutate(name = stringr::str_remove(name, team))

Напишите это вместо своей строки с separate.

В этом случае separate не является оптимальным решением для вас, потому что символ разделения четко не определен.

Также я бы посоветовал вам удалить начальные пробелы из name с помощью stringr::str_trim(name)

1 голос
/ 06 августа 2020

Вы можете сделать это в базе R с помощью gsub и заменить в столбце name образец столбца team на "", т.е. ничего. Мы используем apply() с MARGIN=1 до go во фрейме данных строка за строкой. Наконец, мы используем trimws для очистки от пробелов (где мы меняем на whitespace="[\\h\\v]" для лучшего соответствия пробелов).

res <- transform(results_stradebianchi_2020,
                 name=trimws(apply(results_stradebianchi_2020, 1, function(x) 
                   gsub(x["team"], "", x["name"])), whitespace="[\\h\\v]"))
head(res)
#   rank  X.                  name age                    team UCI.point PCS.points           time
# 1    1 201         van Aert Wout  25        Team Jumbo-Visma       300        200 4:58:564:58:56
# 2    2 234        Formolo Davide  27       UAE-Team Emirates       250        150       0:300:30
# 3    3  87 Schachmann Maximilian  26        BORA - hansgrohe       215        120       0:320:32
# 4    4 111       Bettiol Alberto  26          EF Pro Cycling       175        100       1:311:31
# 5    5  44        Fuglsang Jakob  35         Astana Pro Team       120         90       2:552:55
# 6    6   7         Štybar Zdenek  34 Deceuninck - Quick Step       115         80       3:593:59
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...