Как я могу заполнить вектор столбцом матрицы в R? - PullRequest
0 голосов
/ 17 июня 2020

Предположим, у меня есть следующая матрица:

mat <- matrix(0L,61,5)
mat[,1] <- seq(0.7,60.7,1)
mat[,2] <- seq(0.5,60.5,1)
mat[,3] <- seq(0.4,60.4,1)
mat[,4] <- seq(0.1,60.1,1)
mat[,5] <- seq(0.9,60.9,1)

И следующие векторы:

Vec1: 0   0   0   0   0  20   0   0   0   0   0   0   0  20   0   0   0   0   0   0  20 120   0
Vec2: 0   0   0   0   0   0   0  20   0   0   0   0   0  20   0   0   0   0   0   0  20   0 120
Vec3: 0   0   0   0   0   0   0  20   0   0  20   0   0   0  20 120   0   0   0   0   0   0   0
...

Теперь я хотел бы заполнить векторы значением матрицы (mat [, 1] - > vec1), если вектор не равен нулю. Для простоты это пример, поэтому такие вещи не работают, потому что я не знаю расстояния между значениями и частотой нуля. Однако это должно быть решение для вектора 1:

Vec1 <- c(rep(0,5),mat[1,1],rep(0,7),mat[2,1],rep(0,6),mat[3,1],mat[4,1],0)
> Vec1 0.0 0.0 0.0 0.0 0.0 0.7 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.7 0.0 0.0 0.0 0.0 0.0 0.0 2.7 3.7 0.0

1 Ответ

1 голос
/ 17 июня 2020

Вот подход с mget и lapply из базы R:

veclist <- mget(ls(pattern = "Vec[0-9]+"))

lapply(names(veclist),function(x){
  ind <- as.integer(gsub(".*([0-9]+)","\\1",x))
  result <- veclist[[x]]
  toreplace <- which(result != 0)
  result[toreplace] <- mat[seq_along(toreplace),ind]
  result})
[[1]]
 [1] 0.0 0.0 0.0 0.0 0.0 0.7 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.7 0.0 0.0 0.0 0.0 0.0 0.0 2.7 3.7 0.0

[[2]]
 [1] 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 1.5 0.0 0.0 0.0 0.0 0.0 0.0 2.5 0.0 3.5

[[3]]
 [1] 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.4 0.0 0.0 1.4 0.0 0.0 0.0 2.4 3.4 0.0 0.0 0.0 0.0 0.0 0.0 0.0

Пример данных

Vec1 <- c(0L, 0L, 0L, 0L, 0L, 20L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 20L, 0L, 
0L, 0L, 0L, 0L, 0L, 20L, 120L, 0L)
Vec2 <- c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 20L, 0L, 0L, 0L, 0L, 0L, 20L, 0L, 
0L, 0L, 0L, 0L, 0L, 20L, 0L, 120L)
Vec3 <- c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 20L, 0L, 0L, 20L, 0L, 0L, 0L, 20L, 
120L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...