Mam dwa zestawy danych DT1 i DT2: n = 100 dt1

1
tobinz 15 marzec 2021, 15:16

4 odpowiedzi

Najlepsza odpowiedź

Korzystanie z lapply:

library(data.table)

naming <- c("y","z")

lapply(list_dt, function(x) {
  cols <- intersect(names(x), naming)
  x[get(cols) < 0, (cols) := 0]
})
2
Ronak Shah 15 marzec 2021, 12:39
lapply(list_dt,
       function(.x){
         .x[, lapply(.SD,
                     function(x) fifelse(x<0, 0, x)) , 
            by = "x"]     
       }
)    
2
Kestutis Vinciunas 15 marzec 2021, 12:33

Na podstawie twojego kodu może być skorygowany jako

naming <- c("y","z")
for (i in seq_along(naming)){
     list_dt[[i]][,noquote(naming[i]) := 
                   fifelse(get(naming[i]) < 0, 0, get(naming[i]))] 
}
2
Peace Wang 15 marzec 2021, 12:49

Opcja używająca dplyr i purrr może być:

map(.x = list_dt, 
    ~ .x %>%
     mutate(across(any_of(c("y", "z")), ~ pmax(., 0))))
1
tmfmnk 15 marzec 2021, 12:24