重塑R

时间:2019-07-05 14:34:42

标签: r reshape

我有以下字符串:

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

是的,它们是非常长的字符串(704个长度为1000的字符串),由0和1组成。它们是已经热编码的序列。

由于我想将其输入到卷积模型中,因此我需要某种输入形状,因此我想将每个字符串分成长度为4的子组(以匹配单次编码)。

问题是R不允许我拆分该字符串,就像该字符串不可拆分一样。

例如,如果我执行以下代码:

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

它给了我这个错误:

  

py_call_impl(可调用,dots $ args,dots $ keywords)错误:
    ValueError:无法将大小为704的数组重塑为形状(704,250,4)

我该怎么做才能获得所需的形状(704,250,4)?

3 个答案:

答案 0 :(得分:4)

我们可以使用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)

答案 1 :(得分:2)

这是将长字符串拆分为长度为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"

答案 2 :(得分:2)

您可以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"