重塑 R 中的一个因子
Reshaping a Factor in R
我有以下字符串:
str(seqN)
chr [1:704] "010000100100001010000100010001000100000100101000010001001000001001001000001000010010000100100100010000101000010"| __truncated__ ...
是的,它们是由 0 和 1 组成的非常长的字符串(704 个长度为 1000 的字符串)。它们应该是一个已经被单热编码的序列。
因为我想将其提供给卷积模型,所以我需要特定的输入形状,所以我想将每个字符串拆分为长度为 4 的子组(以匹配 one-hot 编码)。
问题是 R 不让我拆分那个字符串,好像这个字符串是不可拆分的。
例如,如果我执行这段代码:
seqN2 <- array_reshape(seqN,c(704,250,4))
它给我这个错误:
Error in py_call_impl(callable, dots$args, dots$keywords) :
ValueError: cannot reshape array of size 704 into shape (704,250,4)
我应该怎么做才能达到我需要的形状 (704,250,4)?
这里有一个简单的方法可以将一个长字符串拆分成长度为 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"
我们可以使用 strsplit
从 base R
lst1 <- strsplit(seqN, "(?<=.{4})", perl = TRUE)
输出将是 list
的 vector
秒。不确定转换为数字。可能是
lst2 <- lapply(lst1, strtoi, base = 2)
或者如评论中提到的 OP,它只是转换为整数
lst2 <- lapply(lst1, as.integer)
如果它们的长度相同,也可以通过 rbind
ing list
元素
将其转换为 matrix
out <- do.call(rbind, lst2)
您能否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"
我有以下字符串:
str(seqN)
chr [1:704] "010000100100001010000100010001000100000100101000010001001000001001001000001000010010000100100100010000101000010"| __truncated__ ...
是的,它们是由 0 和 1 组成的非常长的字符串(704 个长度为 1000 的字符串)。它们应该是一个已经被单热编码的序列。
因为我想将其提供给卷积模型,所以我需要特定的输入形状,所以我想将每个字符串拆分为长度为 4 的子组(以匹配 one-hot 编码)。
问题是 R 不让我拆分那个字符串,好像这个字符串是不可拆分的。
例如,如果我执行这段代码:
seqN2 <- array_reshape(seqN,c(704,250,4))
它给我这个错误:
Error in py_call_impl(callable, dots$args, dots$keywords) :
ValueError: cannot reshape array of size 704 into shape (704,250,4)
我应该怎么做才能达到我需要的形状 (704,250,4)?
这里有一个简单的方法可以将一个长字符串拆分成长度为 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"
我们可以使用 strsplit
从 base R
lst1 <- strsplit(seqN, "(?<=.{4})", perl = TRUE)
输出将是 list
的 vector
秒。不确定转换为数字。可能是
lst2 <- lapply(lst1, strtoi, base = 2)
或者如评论中提到的 OP,它只是转换为整数
lst2 <- lapply(lst1, as.integer)
如果它们的长度相同,也可以通过 rbind
ing list
元素
matrix
out <- do.call(rbind, lst2)
您能否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"