#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