У меня есть таблица с тремя столбцами ABC, EFG, HIJ. Я хотел бы создать четвертый столбец KLM, который является функцией условного значения ABC и результатом операции на EFG и HIJ.
На данный момент я использую цикл, который занимает около 15 минут над 400 000 строк. И это не кажется мне очень Р. Должен быть способ сделать это значительно меньше времени:
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
Кто-нибудь знает, как упростить и сделать более эффективным, пожалуйста?
df$KLM <- ifelse(!is.na(df$ABC), df$EFG * df$HIJ, NaN)Вы уверены: ABC = c("NaN", 232,234,233,232.5) а не ABC = c(NaN, 232,234,233,232.5) ?
@jogo ваше решение на самом деле то, что я искал. Пользовался 5 лет назад и совсем забыл. Спасибо ! Я думал, что смогу попасть туда с заявками





Решение @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))
Пожалуйста, покажите ваш текущий результат таблицы и сценарий, который вы использовали для создания таблиц.