Изменение формы фактора в R - PullRequest
1 голос
/ 05 июля 2019

У меня есть следующая строка символов:

str(seqN)  
chr [1:704] "010000100100001010000100010001000100000100101000010001001000001001001000001000010010000100100100010000101000010"| __truncated__ ...

Да, это очень длинные строки (704 строки длиной 1000), состоящие из 0 и 1.Предполагается, что они представляют собой последовательность, закодированную в горячем виде.

Поскольку я хочу передать это в сверточную модель, мне нужна определенная форма ввода, поэтому я хочу разбить каждую строку на подгруппы длиной 4 (чтобы соответствовать кодированию в горячем состоянии).

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

Например, если я выполняю этот код:

seqN2 <- array_reshape(seqN,c(704,250,4))

Это дает мне эту ошибку:

Ошибка в py_call_impl (вызываемый, точки $ args, точки $ ключевые слова):
ValueError: не может изменить массив размера704 в форму (704,250,4)

Что мне нужно сделать, чтобы получить нужную мне форму (704,250,4)?

Ответы [ 3 ]

4 голосов
/ 05 июля 2019

Мы можем использовать strsplit от base R

lst1 <- strsplit(seqN, "(?<=.{4})", perl = TRUE)

Выход будет list из vector с. Не уверен насчет преобразования в число. Может быть

lst2 <- lapply(lst1, strtoi, base = 2)

Или, как указано в комментариях к OP, он конвертируется только в целое число

lst2 <- lapply(lst1, as.integer)

Если они имеют одинаковую длину, его также можно преобразовать в matrix с помощью rbind с элементами list

out <- do.call(rbind, lst2)
2 голосов
/ 05 июля 2019

Вы можете stringr извлечь все последовательности длиной до 4 символов:

library(stringr)
str_extract_all(seqN, ".{1,4}", simplify = T)[1,]
 [1] "0100" "0010" "0100" "0010" "1000" "0100" "0100" "0100" "0100" "0001" "0010" "1000" "0100" "0100" "1000" "0010" "0100" "1000" "0010"
[20] "0001" "0010" "0001" "0010" "0100" "0100" "0010" "1000" "010" 
2 голосов
/ 05 июля 2019

простой способ разбить длинную строку на подстроки длиной 4. Просто настройте переменную n в соответствии с вашими потребностями:

mystring <- "110010101101"
n <- 2 # n <- nchar(mystring) / 4 -1

sapply(1 + 4*0:n, function(z) substr(mychar, z, z+3))
[1] "1100" "1010" "1101"
...