R: цикл по переменным с условиями - PullRequest
0 голосов
/ 25 октября 2019

У меня есть x1, x2, ..., x96, y1, y2, ..., y96 категориальные переменные с levels(x1,...,x96) = c(1,2,3,4,5), levels(y1,...,y96) = c(11,12,13,14,15).

Есть около 200 000 записей без NA.

Я хотел бы просмотреть все записи и переменныетак что

data[,paste0('z',1:96)] = 0
data$xx = 0
data$yy = 0
for (row in 1:nrow(data)) {
    for (i in 1:96) {
        if (data[row,paste(x,i,sep="")] == 1
          | data[row,paste(x,i,sep="")] == 2
          | data[row,paste(x,i,sep="")] == 5) {
            if (data[row,paste(y,i,sep="")] == 11
              | data[row,paste(y,i,sep="")] == 12) {
                data[row,paste0('z',i)] = 1
            } else {
                data$xx = data$xx + 1
            }
        } else if (data[row,paste(x,i,sep="")] == 3) {    
            if (data[row,paste(y,i,sep="")] == 14
              | data[row,paste(y,i,sep="")] == 15) {
                data$xx = data$xx + 1
            } else {
                data$yy = data$yy + 1
            } 
        }
    }
}

Теперь, он успешно работает и дает мне правильный вывод, но это занимает так мучительно много времени, как больше, если добавить операторы ...

Так как это простопростой цикл с кучей ifelse, я думаю, что должен быть какой-то эффективный способ добиться того, что я делаю.

Спасибо!

1 Ответ

1 голос
/ 25 октября 2019

Не проверено, без выборочных данных или ожидаемого вывода, но это мое лучшее предположение. Это, безусловно, будет быстрее, так как все операции со строками векторизованы.

inds = 1:96
xs = paste0(x, inds)
ys = paste0(y, inds)
zs = paste0(z, inds)

xx = 0
yy = 0
data[, zs] = 0

for(i in seq_along(inds)) {
  condition_1a = data[, xs[i]] %in% c(1, 2, 5)
  conditoin_1b = data[, ys[i]] %in% c(11, 12)
  data[condition_1a & condition_1b, zs[i]] = 1  
  xx = xx + sum(condition1a & !condition_1b)

  condition_2a = data[, xs[i]] %in% c(3)
  condition_2b = data[, ys[i]] %in% c(14, 15)
  xx = xx + sum(condition_2a & condition_2b)
  yy = yy + sum(condition_2a & !condition_2b)
}

data$xx = xx
data$yy = yy
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...