I have this list of strings:
dat <- list(V1=c("1:23","4:12"),V2=c("1:3","2:12","6:3"))
the list elements V1 and V2 are the columns. 1:23 means "the first entry in this column has value 23". All other entries should be zero. The dimension of the matrix is indicated by the highest entry, in this case we have 2 columns (V1 and V2) and the highest row number is a 6, so it would result in a 2x6 matrix like this:
matrix(c(23,3,
0,12,
0,0,
12,0,
0,0,
0,3),nrow=6,ncol=2,byrow=T)
how can this convertion be achieved?
You may also try
library(dplyr)
library(tidyr)
library(Matrix)
d1 <- unnest(dat,col) %>%
separate(x, into=c('row', 'val'), ':', convert=TRUE) %>%
extract(col, into='col', '\\D+(\\d+)', convert=TRUE)
as.matrix(with(d1, sparseMatrix(row, col, x=val)))
# [,1] [,2]
#[1,] 23 3
#[2,] 0 12
#[3,] 0 0
#[4,] 12 0
#[5,] 0 0
#[6,] 0 3
Solution:
dat <- list(V1=c("1:23","4:12"),V2=c("1:3","2:12","6:3"))
y <- inverse.rle(list(values = 1:length(dat),lengths = sapply(dat,length)))
x <- as.numeric(unlist(sapply(dat,function(y)sapply(strsplit(y,":"),function(x)x[1]))))
val <- as.numeric(unlist(sapply(dat,function(y)sapply(strsplit(y,":"),function(x)x[2]))))
num_row <- max(x)
num_col <- max(y)
m = matrix(0, nrow = num_row, ncol = num_col)
m[cbind(x,y)] <- val
m
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With