Применить функцию с тремя атрибутами в R - PullRequest
1 голос
/ 24 июня 2019

У меня есть таблица с тремя столбцами ABC, EFG, HIJ. Я хотел бы создать четвертый столбец KLM, который является функцией условного значения ABC и результата операции для EFG и HIJ.

На данный момент я использую цикл, который занимает около 15 минут на 400 000 строк. И это не кажется мне очень R. Должен быть способ сделать это значительно меньше времени:

for (i in 1:nrow(df)){
  if(is.na(df$ABC[i]) == FALSE ){
    df$KLM[i] <- as.numeric(df$EFG[i] * df$HIJ[i])
  } else {
    df$KLM[i] = NaN
  }
}

Я добавил df:

ABC = c("NaN", 232,234,233,232.5)
EFG = c(12,12,12,12,12)
HIJ = c(10.75, 10.95, 11.25, 10.85, 10.55)
KLM = c(0,0,0,0,0)

df <- as.data.frame(cbind(ABC, EFG, HIJ, KLM))
df < unfactor(df)


> df
    ABC EFG   HIJ KLM
1   NaN  12 10.75   0
2   232  12 10.95   0
3   234  12 11.25   0
4   233  12 10.85   0
5 232.5  12 10.55   0

Кто-нибудь знает, как упростить и сделать более эффективным, пожалуйста?

1 Ответ

1 голос
/ 24 июня 2019
Решение

@ jogo, упомянутое в комментариях, является лучшим векторизованным решением для data.frame.

Используя data.table, его можно оптимизировать следующим образом:

dt = as.data.table(df)
dt[,`:=`(KLM=NaN)]
set(x = dt, i =which(!is.na(dt$ABC)),j="KLM",value = as.numeric(EFG * HIJ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...