#r #string #tidyr
#r #строка #tidyr
Вопрос:
Я пытаюсь разделить столбец string в моем фрейме данных на два разных столбца на основе a . Мои данные выглядят так :
Rk Player Season Age Tm Lg WS G GS MP FG FGA `2P` `2PA` `3P` `3PA` FT FTA ORB DRB TRB AST STL BLK TOV PF
<dbl> <chr> <chr> <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 "LeBro~ 2010-~ 26 MIA NBA 15.6 79 79 3063 758 1485 666 1206 92 279 503 663 80 510 590 554 124 50 284 163
2 2 "Pau G~ 2010-~ 30 LAL NBA 14.7 82 82 3037 593 1120 592 1117 1 3 354 430 268 568 836 273 48 130 142 203
Столбец, которым я пытался манипулировать, — это столбец ‘Player’. Записи для этого столбца выглядят следующим образом.
"LeBron James\jamesle01" "Pau Gasol\gasolpa01" "Dwight Howard\howardw01"
Я хочу, чтобы она была разделена на два столбца pName и pID
pName pID
LeBron James jamesle01
Pau Gasol gasolpa01
Dwight Howard howardw01
Я пытался использовать gsub
, sub
, str_replace
, и separate
и не смог понять это
player_stats2010 %>%
str_replace(Player,"\.*","")
player_stats2010 %>%
sub("\", "", player_stats2010$Player)
player_stats2010 %>%
sub(".*", "", player_stats2010$Player)
player_stats2010 %>%
gsub(".*", "", player_stats2010$Player)
player_stats2010_test <- player_salaries_2010 %>%
separate(Player, c("pName", "pID"), "")
Я действительно не понимаю синтаксис этого вопроса, несмотря на просмотр онлайн и несколько других вопросов. Если бы вы могли, пожалуйста, помочь мне понять, чего я не понимаю, это было бы здорово. Большое вам спасибо 🙂
Комментарии:
1. Может
strsplit(x, "\", fixed = TRUE)
быть?
Ответ №1:
1) прочитайте таблицу, используя x
примечание в конце, и используйте только базовое значение R read.table
, как показано на рисунке:
read.table(text = x, sep = "\", col.names = c("pName", "pID"))
отдавая:
pName pID
1 LeBron James jamesle01
2 Pau Gasol gasolpa01
3 Dwight Howard howardw01
2) tidyr
С помощью tidyr мы могли бы сделать это:
library(tidyr)
data.frame(x) %>%
separate(x, c("pName", "pID"), sep = r"{\}")
Примечание
Предполагается, что входные данные:
x <- c("LeBron James\jamesle01", "Pau Gasol\gasolpa01", "Dwight Howard\howardw01")
Комментарии:
1. Просто примечание, для которого
r"{\}"
требуется R версии 4.0.0 или выше. К сожалению, многие люди все еще работают с предыдущими версиями.2. Используйте «\\», если ваша версия R не поддерживает r»{..}»
3. Большое вам спасибо, это сработало. Не могли бы вы, возможно, объяснить, что
sep = r"{\}"
делает и почему это не простоsep = "\"
?4. Если вы используете «…», то при цитировании будет удален один уровень обратной косой черты, а затем регулярное выражение удалит второй, поэтому для указания регулярного выражения, содержащего одну обратную косую черту, требуется, чтобы вы удвоили его для цитирования, а затем снова удвоили его для регулярного выражения. Если вы используете r»{…}», то обратная косая черта не является специальной для цитирования, но все равно должна быть удвоена для регулярного выражения.
Ответ №2:
Вы можете использовать str_extract
из пакета stringr
, а также классы символов, которые не включают \
:
library(stringr)
player_stats$pName <- str_extract(player_stats$Player, "^[\w\s] ")
player_stats$pID <- str_extract(player_stats$Player, "[\w\s] $")
В обоих случаях вы определяете символьный класс, позволяющий использовать только буквы ( \w
) и символы пробела ( \s
) , разница между двумя переменными заключается в том, что pName
поиск этого шаблона начинается с начала строки ( ^
), а pID
поиск — с конца строки ( $
) .
Результат:
player_stats
Player pName pID
1 LeBron Jamesjamesle01 LeBron James jamesle01
2 Pau Gasolgasolpa01 Pau Gasol gasolpa01
3 Dwight Howardhowardw01 Dwight Howard howardw01
Данные:
player_stats <- data.frame(
Player = c("LeBron James\jamesle01", "Pau Gasol\gasolpa01", "Dwight Howard\howardw01"))
Комментарии:
1. Спасибо за ответ и объяснение!