объединить строку в вектор цифр c - PullRequest
0 голосов
/ 09 февраля 2020

Предположим, у меня длинная строка чисел "1010101010101010100011011". Я хотел бы разделить их символом ",", например, "1,0,1,0,1,0,1,1,...", а затем преобразовать в числительный c вектор, подобный этому c(1,0,1,0,1,...).

Каким был бы разумный способ сделать это?

Ответы [ 4 ]

4 голосов
/ 09 февраля 2020

Второй вариант -

utf8ToInt(x) - 48L
# [1] 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 1 1 0 1 1
4 голосов
/ 09 февраля 2020
a <- "1010101010101010100011011"

b <- unlist(strsplit(a,""))

c <- as.numeric(b)

class(c)
#> [1] "numeric"
3 голосов
/ 09 февраля 2020

1) strapply Извлеките каждый символ и преобразуйте его в цифру c, указав вектор цифры c:

library(gsubfn)
x <- "1010101010101010100011011"
strapply(x, ".", as.numeric, simplify = c)
## [1] 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 1 1 0 1 1

Если у вас есть вектор таких строк, то это может быть использован для создания списка числовых c векторов:

xx <- c(x, x)
strapply(xx, ".", as.numeric)

2) scan Вставьте пробел после каждого символа и затем отсканируйте его, указав числовой c вектор , x определено в (1).

scan(text = gsub("(.)", "\\1 ", x), quiet = TRUE)
## [1] 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 1 1 0 1 1

3) read.fwf Считайте его как фиксированные поля шириной 1, дающие фрейм данных. x определено в (1).

read.fwf(textConnection(x), widths = rep(1, nchar(x)))
##   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21
## 1  1  0  1  0  1  0  1  0  1   0   1   0   1   0   1   0   1   0   0   0   1
##   V22 V23 V24 V25
## 1   1   0   1   1
2 голосов
/ 09 февраля 2020

Другой вариант (следуя шагам, которые вы описали): сначала вставьте ,:

x <- gsub("(?!^|$)", ",", x, perl = TRUE)

x

[1] "1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,1,1,0,1,1"

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

scan(text = x, what = 0L, sep = ",", quiet = TRUE)

[1] 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 1 1 0 1 1
...