Как заменить определенную символьную строку числом?

#r #gsub

#r #gsub

Вопрос:

Я работаю с фреймом данных под названием Clutch, содержащим информацию о картах в карточной игре. Одна из переменных, CMD , может состоять из следующих значений:

 "R 1"
"L 1"
"R 2"
"L 2"
0
  

Что я хочу сделать, так это создать новую переменную Clutch $ C , которая принимает эти строковые значения для каждой точки данных и заменяет их числами. R 1 и L 1 заменяются на 0,5, а R 2 и L 2 заменяются на 1. Значение 0 не меняется.

Как мне это сделать? Извините, если это простой вопрос, мои навыки в области R в данный момент невелики, я работаю над улучшением.

Ответ №1:

возможно, не самое красивое решение, но это должно сработать.

 C<-rep(0,length(Clutch$CMD))
Clutch<-cbind(Clutch,C)
Clutch$C [which(Clutch$CMD =="R 1")]<-0.5
Clutch$C [which(Clutch$CMD =="L 1")]<-0.5
Clutch$C [which(Clutch$CMD =="R 2")]<-1
  

Ответ №2:

Вы можете попробовать:

 paste0(as.numeric(gsub("\D", "\1", x))/2, sub("\D", "\1", x))

[1] "0.5 1" "0.5 1" "1 2"   "1 2"  
  

Ответ №3:

Вот один из способов, использующий тот факт, что результат равен половине цифры в вашей строке :

 Clutch <- data.frame(`CMD ` = sample(c("R 1", "L 1", "R 2", "L 2", 0), 10, replace = TRUE))

Clutch[["C "]] <- as.numeric(gsub("[^0-9]", "", Clutch$CMD))/2

Clutch

> Clutch
   CMD.  C 
1   R 1 0.5
2   R 2 1.0
3   R 1 0.5
4   L 1 0.5
5   L 1 0.5
6   R 1 0.5
7   R 1 0.5
8   L 1 0.5
9     0 0.0
10  L 1 0.5
  

Ответ №4:

Вы можете просто использовать gsub

 > as.numeric(gsub(".*[ ]","",a))/2
[1] 0.5 0.5 1.0 1.0 0.0
  

Если это data frame . Вы можете использовать это-

 > library(data.table)
> dt <- data.frame(CMD = c("R 1", "L 1", "R 2", "L 2", 0))
> setDT(dt)[,CMD:=as.numeric(gsub(".*[ ]","",a))/2]
> dt
   CMD
1: 0.5
2: 0.5
3: 1.0
4: 1.0
5: 0.0
  

Ответ №5:

Другая идея заключается в использовании простого ifelse оператора, который ищет 1 в строке и заменяет на 0.5, и 2 для замены на 1, т.е.

 #where x is your column,

as.numeric(ifelse(grepl('1', x), 0.5, ifelse(grepl('2', x), 1, x)))
#[1] 0.5 0.5 1.0 1.0 0.0