#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