Разделите строку фрейма данных на основе

#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. Спасибо за ответ и объяснение!