Как заменить недвоичные (кроме 0/1) символы в числовом векторе нулями (в R)? - PullRequest
2 голосов
/ 02 июня 2019

При создании сложной функции мне нужно было преобразовать все недвоичные (кроме 0/1) символы в числовом векторе в нули:

cwhmisc::int(1010110.001) # 1010110; integer part; class=integer
cwhmisc::frac(1010110.001) # 0.001; fractional part; class=numeric
as.character(cwhmisc::frac(1010110.001)) # "0.00100000004749745" (unwanted nonbinaries (4,7,4,9,7,4,5) produced)
toString(cwhmisc::frac(1010110.001))     # "0.00100000004749745" (was not a solution to kill unwanted things)
nchar(cwhmisc::frac(1010110.001))        # 19 (unwanted things are really there)
as.numeric(strsplit(substr(as.character(cwhmisc::frac(1010110.001)),3,nchar(as.character(cwhmisc::frac(1010110.001)))),"")[[1]]) # 0 0 1 0 0 0 0 0 0 0 4 7 4 9 7 4 5

Как конвертировать
c(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 7, 4, 9, 7, 4, 5)
до
c(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)

Ответы [ 3 ]

2 голосов
/ 02 июня 2019
x <- c(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 7, 4, 9, 7, 4, 5)
ifelse(x == 0 | x == 1, x, 0)
# [1] 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 голос
/ 02 июня 2019

Вы также можете сделать:

x * (x == 1)

 [1] 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 голосов
/ 10 июня 2019

Для полноты я добавил решение Эндрю Густара:

gsub("[^1]", "0", cwhmisc::frac(1010110.001)) # "0000100000000000000"
noOfchars <- nchar(gsub("[^1]", "0", cwhmisc::frac(1010110.001))) # 19

substr( gsub("[^1]", "0", cwhmisc::frac(1010110.001)), 3, noOfchars) # [1] "00100000000000000". Remove leading "0."

gsub (шаблон, замена, строка): заменить все совпадения в сопоставлении и замене шаблона.
pattern: строка символов, содержащаярегулярное выражение (или символьная строка для fixed = TRUE) для сопоставления в заданном символьном векторе.

"[^1]"

замена: "0"
Вектор символов, в котором ищутся совпадения:

cwhmisc::frac(1010110.001) # 0.001  

(Примечание: options(digits=22); cwhmisc::frac(1010110.001) # 0.0010000000474974513)

...