Как заменить конкретную символьную строку цифрой? - PullRequest
1 голос
/ 05 апреля 2019

Я работаю с информационным фреймом под названием 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 не очень хороши в данный момент, я работаю над тем, чтобы стать лучше.

Ответы [ 5 ]

1 голос
/ 05 апреля 2019

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

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
1 голос
/ 05 апреля 2019

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

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

[1] "0.5+1" "0.5+1" "1+2"   "1+2"  
0 голосов
/ 05 апреля 2019

Другая идея заключается в использовании простого оператора 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
0 голосов
/ 05 апреля 2019

Вы можете просто использовать 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
0 голосов
/ 05 апреля 2019

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

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
...