分裂整数并转换成矩阵

时间:2016-07-24 18:22:30

标签: r string matrix

我想知道是否有可能在一组数字中对每个整数进行字符串分割并将其转换为转换矩阵,例如

data<-c(11,123,142,1423,1234,12)

我想做的是分割数据中的每个整数(仅考虑数据集中的前两个元素),第一个元素将是1,1秒元素将是1,2,3 ....将其转换为矩阵e,g 1,1将为1对1,1,2将为1至2,2,3将为2至3.生成以下矩阵

   1 2 3 4 5 
1  1 1 0 0 0
2  0 0 1 0 0
3  0 0 0 0 0
4  0 0 0 0 0
5  0 0 0 0 0

我的矩阵永远不会超过5x5。以下是我所做的工作,但它真的很乏味。

data2<-as.matrix(as.character(data))
for(i in 1:nrow(data2)) {
values<-strsplit(data2,"")
}
values2<-t(sapply(values, '[', 1:max(sapply(values, length))))
values2[is.na(values2)]<-0
values3<-apply(values2,2,as.numeric)
from1to1<-0
from1to2<-0
from1to3<-0
from1to4<-0
from1to5<-0
from2to1<-0
from2to2<-0
from2to3<-0
from2to4<-0
...
from5to4<-0
from5to5<-0
for(i in 1:nrow(values3)){
  for(j in 1:(ncol(values3)-1))
if   (((values3[i,j]==1)&(values3[i,j+1]==1))){
  from1to1<-from1to1 + 1
}else{
  if   (((values3[i,j]==1)&(values3[i,j+1]==2))){
    from1to2<-from1to2 + 1
  }else{
    if   (((values3[i,j]==1)&(values3[i,j+1]==3))){
      from1to3<-from1to3 + 1
    }else{
      if   (((values3[i,j]==1)&(values3[i,j+1]==4))){
        from1to4<-from1to4 + 1
      }else{
        if   (((values3[i,j]==1)&(values3[i,j+1]==5))){
          from1to5<-from1to5 + 1
        }else{
          if   (((values3[i,j]==1)&(values3[i,j+1]==1))){
            from1to1<-from1to1 + 1
          }else{.....continues through all other from2to1...from5to5``

然后我将每个数字放入一个5x5矩阵中。

这显然是乏味而漫长而荒谬的。反正有没有缩短这个?任何建议表示赞赏。

1 个答案:

答案 0 :(得分:1)

这是一个选项,在这里以管道方式呈现,以便易于理解:

library(magrittr)    # for the pipe

# initialize a matrix of zeros
mat <- matrix(0, 5, 5)

# split each element into individual digits
strsplit(as.character(data), '') %>% 
    # turn list elements back to integers
    lapply(as.integer) %>% 
    # make a 2 column matrix of each digit paired with the previous digit
    lapply(function(x){matrix(c(x[-length(x)], x[-1]), ncol = 2)}) %>%
    # reduce list to a single 2-column matrix
    do.call(rbind, .) %>% 
    # for each row, add 1 to the element of mat they subset
    apply(1, function(x){mat[x[1], x[2]] <<- mat[x[1], x[2]] + 1; x})
# output is the transpose of the matrix; the real results are stored in mat
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
## [1,]    1    1    2    1    4    1    4    2    1     2     3     1
## [2,]    1    2    3    4    2    4    2    3    2     3     4     2

mat
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    3    0    2    0
## [2,]    0    0    3    0    0
## [3,]    0    0    0    1    0
## [4,]    0    2    0    0    0
## [5,]    0    0    0    0    0

或者,如果您想按照alexis_laz的建议xtabs,请将最后一行替换为xtabs(formula = ~ .[,1] + .[,2]),而不是使用mat

你也可以查看the permutations package,我可以告诉它似乎是用于处理这类数据,虽然它有些高级。