В поисках того, что должно быть невероятно простым решением. Я хотел бы условно заменить значение в строке, если оно удовлетворяет заданному условию (меньше нуля), и я хотел бы сделать это для сотен (двадцать в примере) столбцов, каждый из которых содержит 150 миллионов строк. Я на седьмом часу пробую каждое решение, найденное в стеке, поэтому, пожалуйста, не помечайте это как дубликат. :-)
Данные:
library(data.table)
library(dplyr)
dt <- data.table(id=c(1:1000), x=rnorm(1:1000,60,20))
Использование интуитивного цикла для создания новых столбцов:
## Create new variables
for(i in 50:70) {
dt[, paste0("y", i) := i-x]
}
Простая команда для одного столбца, прекрасно работает:
dt$y60[dt$y60<0 ] <- 0
Поместите это внутрь цикла, и оно не будет работать:
for(i in 50:70) {
dt$y[i][dt$y[i]<0] <- 0
}
Каким должен быть простой подход DT, не повезло:
for(i in 50:70) {
dt[y[i]<0, y[i] := 0]
}
Попытка подхода ifelse()
, не повезло:
for(i in 50:70) {
dt$y[i] <- ifelse(dt$y[i] < 0, 0, dt$y[i])
}
Попытка сначала создать список, а затем использовать set()
, без кубиков:
list <- dt %>% dplyr:: select(starts_with("y"))
for(i in 50:70) {
set(dt, i, list , 0)
}
Моя жизнь в твоих руках, спасибо !!