Замена апострофа и пробелов во всем столбце в R

#r #replace

#r #заменить

Вопрос:

У меня есть фрейм данных со столбцами коэффициентов, которые представляют высоту и размах крыльев спортсменов. Я пытаюсь изменить формат размаха крыльев с ex. 5 ‘ 10.5″ на что-то вроде 5.105 и 6’ 1″ на 6.01 для точного построения графиков. Если есть способ сделать это, пожалуйста, дайте мне знать 🙂 Спасибо за ваше время!

Я пробовал replace() и str_replace_all(), но это не работает. У меня также есть измерения в виде 6. 6.5 и 6. 11.5, однако вы, вероятно, можете увидеть, как R предположил бы, что у первого размах крыльев больше, чем у второго. Это моя проблема.

Вот мой код:

 #playerphysicals is a dataframe of factors that contains various physiological measurements of 1328 NBA athletes.
    playerphysicals1<- tibble(playerphysicals=c("5' 10.5"", "6' 1""))
    out <- playerphysicals %>% 
      mutate(first = as.numeric(str_extract(playerphysicals$Wingspan, "[^'] ")), 
             second = str_extract(playerphysicals$Wingspan, '[\d\.] "$'),
             second = as.numeric(str_replace(second, """, ""))/100, 
             x_num = first   second) %>% 
      select(-first, -second) %>%
      as.data.frame
    out

    #output
    x_num
    <dbl>
     NA
     NA
     NA        
  

Комментарии:

1. Можете ли вы показать все шаблоны и ожидаемый результат

Ответ №1:

Вы могли бы сделать это следующим образом. Во-первых, вы могли бы разделить первое число на второе, убрать двойные кавычки из второго члена и превратить их оба в числа. Затем вы должны разделить второе число на 100 и добавить его к первому.

 library(tibble)
library(stringr)
library(dplyr)
df <- tibble(x=c("5' 10.5"", "6' 1""))
out <- df %>% 
  mutate(first = as.numeric(str_extract(x, "[^'] ")), 
         second = str_extract(x, '[\d\.] "$'),
         second = as.numeric(str_replace(second, """, ""))/100, 
         x_num = first   second) %>% 
  select(-first, -second) %>%
  as.data.frame
out
#          x x_num
# 1 5' 10.5" 5.105
# 2    6' 1" 6.010
  

РЕДАКТИРОВАТЬ — добавить в фактическую структуру фрейма данных

В ответ на комментарии, вот это с использованием данных OP. Мне пришлось немного изменить. Я создал имя набора данных playerphysicals и имя переменной Wingspan . Обратите внимание, что внутри dplyr функций вам не нужно вызывать переменную с data$variable , вы можете просто использовать имя переменной, потому что данные неявно вызываются в функции через pip ( %>% ).

 playerphysicals <- tibble(Wingspan=c("5' 10.5"", "6' 1""))
playerphysicals
# # A tibble: 2 x 1
#   Wingspan   
#   <chr>      
# 1 "5' 10.5""
# 2 "6' 1""   

out <- playerphysicals %>% 
  mutate(first = as.numeric(str_extract(Wingspan, "[^'] ")), 
         second = str_extract(Wingspan, '[\d\.] "$'),
         second = as.numeric(str_replace(second, """, ""))/100, 
         Wingspan_num = first   second) %>% 
  select(-first, -second) %>%
  as.data.frame
out
#   Wingspan Wingspan_num
# 1 5' 10.5"        5.105
# 2    6' 1"        6.010
  

Комментарии:

1. Привет, Дэйв, похоже, это сработало. Поскольку я новичок в R, я сейчас задам основной вопрос. Как я могу применить это не только к предоставленным 2 значениям («5′ 10.5», «6′ 1») но для всего столбца? Спасибо you1

2. @NickA допустим, у вас есть набор данных с именем my_data с переменной с именем z , которая содержит все эти строки. Вам просто нужно заменить out <- df на out <- my_data и заменить x — первый аргумент на str_extract() в следующих двух строках на z имя вашей переменной, содержащей все строки.

3. Хорошо, мы добиваемся прогресса! Однако теперь весь мой новый столбец заполнен NA.

4. Без просмотра ваших данных трудно устранить неполадки. Можете ли вы отредактировать свой вопрос и опубликовать фактический набор данных.

5. @NickA Хорошо, я отредактировал ответ, чтобы включить эту новую структуру данных с несколькими небольшими изменениями.

Ответ №2:

Попробуйте это

 test <- structure(list(my_column = c("5' 10.5"", "6' 1"")), class = "data.frame", row.names = c(NA, 
                                                                                           -2L))

test$my_column <- gsub(pattern = "'", replacement = '', test$my_column) # replace ' by nothing
test$my_column <- gsub(pattern = """, replacement = '', test$my_column) # replace " by nothing
test$my_column <- gsub(pattern = " ", replacement = '', test$my_column) # replace space by nothing