Как построить цикл for, если мне нужно другое окончание в разных случаях? - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть задача построить фрейм данных с заданными правилами:

Существует вектор, подобный V<-c(10, 20, 15, 22, 60).Мне нужны столбцы длины (V) и max(V) строк.Для каждого i-столбца мне нужны значения V [i].Например, для первого столбца мне нужно 10 ненулевых значений и 50 нулей, для второго столбца мне нужно 20 ненулевых значений и 40 нулей.Для этой проблемы я запускаю код:

EL<-matrix( rep( 0, len=3400), nrow = 8)
for (i in 1:8){
  for (j in 1:(n[i])){
    EL[j,i]<-100*p[i]*LGD[i]
  }
}

Он показывает ошибку

Ошибка в [<- (<em> tmp , j, i, value =100 * p [i] * LGD [i]):
нижний индекс вне границ`.Должен ли я выполнить цикл ifelse или есть какие-либо возможные способы решения этой проблемы &

Ответы [ 4 ]

0 голосов
/ 11 декабря 2018

Вот решение с использованием vapply

vapply(seq_along(V), function(k) c(rep(1L, V[k]),rep(0L, max(V) - V[k])), integer(max(V)))
# yielding
      [,1] [,2] [,3] [,4] [,5]
 [1,]    1    1    1    1    1
 [2,]    1    1    1    1    1
 [3,]    1    1    1    1    1
 [4,]    1    1    1    1    1
 [5,]    1    1    1    1    1
 [6,]    1    1    1    1    1
 [7,]    1    1    1    1    1
 [8,]    1    1    1    1    1
 [9,]    1    1    1    1    1
[10,]    1    1    1    1    1
[11,]    0    1    1    1    1
[12,]    0    1    1    1    1
[13,]    0    1    1    1    1
[14,]    0    1    1    1    1
[15,]    0    1    1    1    1
[16,]    0    1    0    1    1
[17,]    0    1    0    1    1
[18,]    0    1    0    1    1
[19,]    0    1    0    1    1
[20,]    0    1    0    1    1
[21,]    0    0    0    1    1
...
0 голосов
/ 11 декабря 2018

Другая опция для функции внутри sapply заключается в том, чтобы использовать тот факт, что rep принимает вектор для аргумента times.Это повторяется 1 x раз, а затем повторяется 0 V_max - x раз.

V <- c(10, 20, 15, 22, 60)
V_max <- max(V)
mat <- sapply(V, function(x) rep(c(1L, 0L), times = c(x, V_max - x)))

mat

#       [,1] [,2] [,3] [,4] [,5]
#  [1,]    1    1    1    1    1
#  [2,]    1    1    1    1    1
#  [3,]    1    1    1    1    1
#  [4,]    1    1    1    1    1
#  [5,]    1    1    1    1    1
#  [6,]    1    1    1    1    1
#  [7,]    1    1    1    1    1
#  [8,]    1    1    1    1    1
#  [9,]    1    1    1    1    1
# [10,]    1    1    1    1    1
# [11,]    0    1    1    1    1
# [12,]    0    1    1    1    1
# [13,]    0    1    1    1    1
# [14,]    0    1    1    1    1
# [15,]    0    1    1    1    1
# [16,]    0    1    0    1    1
# [17,]    0    1    0    1    1
# [18,]    0    1    0    1    1
# [19,]    0    1    0    1    1
# [20,]    0    1    0    1    1
# [21,]    0    0    0    1    1
# [22,]    0    0    0    1    1
# ...

Теперь для более глупого решения (тот же результат, за исключением имен столбцов)

m <- matrix(0, max(V), length(V))
+(data.frame(row(m)) <= as.list(V))
0 голосов
/ 11 декабря 2018

Я бы создал разреженную матрицу:

library(Matrix)

V<-c(10, 20, 15, 22, 60)

M <- sparseMatrix(dims = c(max(V), length(V)), 
                  i = sequence(V), j = rep(seq_along(V), V))
#60 x 5 sparse Matrix of class "ngCMatrix"
#               
# [1,] | | | | |
# [2,] | | | | |
# [3,] | | | | |
# [4,] | | | | |
# [5,] | | | | |
# [6,] | | | | |
# [7,] | | | | |
# [8,] | | | | |
# [9,] | | | | |
#[10,] | | | | |
#[11,] . | | | |
#[12,] . | | | |
#[13,] . | | | |
#[14,] . | | | |
#[15,] . | | | |
#[16,] . | . | |
#[17,] . | . | |
#[18,] . | . | |
#...

Если по какой-то причине вам действительно нужна плотная целочисленная матрица (зачем вам?), Тогда вы можете сделать +as.matrix(M).

0 голосов
/ 11 декабря 2018

Вот способ использования sapply и tabulate

V <- c(10, 20, 15, 22, 60)
V_max <- max(V)
sapply(V, function(x) {
  tabulate(seq_len(x), nbins = V_max)
})

Результат

head(mat, 25)
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    1    1    1    1    1
# [2,]    1    1    1    1    1
# [3,]    1    1    1    1    1
# [4,]    1    1    1    1    1
# [5,]    1    1    1    1    1
# [6,]    1    1    1    1    1
# [7,]    1    1    1    1    1
# [8,]    1    1    1    1    1
# [9,]    1    1    1    1    1
#[10,]    1    1    1    1    1
#[11,]    0    1    1    1    1
#[12,]    0    1    1    1    1
#[13,]    0    1    1    1    1
#[14,]    0    1    1    1    1
#[15,]    0    1    1    1    1
#[16,]    0    1    0    1    1
#[17,]    0    1    0    1    1
#[18,]    0    1    0    1    1
#[19,]    0    1    0    1    1
#[20,]    0    1    0    1    1
#[21,]    0    0    0    1    1
#[22,]    0    0    0    1    1
#[23,]    0    0    0    0    1
#[24,]    0    0    0    0    1
#[25,]    0    0    0    0    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...