Более быстрая альтернатива зацикливанию в сочетании с If в R - PullRequest
0 голосов
/ 06 августа 2020

У меня есть фрейм данных с более чем 2000000 строками и 22 столбцами. В трех столбцах значения 0, 1 или NA. Я хочу иметь столбец, в котором сумма этих трех столбцов для каждой строки обрабатывается как 0. Использование a для l oop определенно слишком медленно.

У вас есть какие-нибудь альтернативы для меня? Другая идея заключалась в использовании mutate в канале, но у меня проблемы с выбором столбцов, которые я хочу добавить по имени.

Первая попытка:

for(i in 1:nrow(T12)){

  if(is.na(T12$blue[i])  & is.na(T12$blue.y[i])) {
  
    T12$blue[i] <- T12$blue.x[i]
  
  }else if(is.na(T12$blue[i])  & is.na(T12$blue.x[i])){
  
  
    T12$blue[i] <- T12$blue.y[i]
  }else if(is.na(T12$blue[i])  & is.na(T12$blue.x[i]) & is.na(T12$blue.y[i]) )
    T12[i,] <- NULL
}

Спасибо!

Ответы [ 3 ]

2 голосов
/ 06 августа 2020

Я предполагаю, что столбцы, которые вы sh должны добавить, являются первыми тремя. Если вам нужны другие столбцы, просто измените c(1,2,3) в приведенном ниже коде.

apply(T12[,c(1,2,3)], 1, sum, na.rm=TRUE)

Примечание: @ 27ϕ9 отмечает, что более быстрое решение -

rowSums(T12[,c(1,2,3)], 1, na.rm=TRUE)
0 голосов
/ 06 августа 2020

Если имена столбцов вашего объекта a, b и c, возможно, вы можете попробовать приведенный ниже код

within(T12, new <- rowSums(cbind(a,b,c),na.rm = TRUE))
0 голосов
/ 06 августа 2020

Сначала вы можете заменить все NA на 0.

df[is.na(df)] <- 0
setDT(df)[,newcol := a + b + c]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...