【问题标题】:Modify rows of multiple data.table files修改多个data.table文件的行
【发布时间】:2021-06-12 17:04:03
【问题描述】:

我有两个数据集dt1dt2

N = 100
dt1 <- data.table(x = rnorm(N), y=rnorm(N))
dt2 <- data.table(x = rnorm(N), z=rnorm(N))
list_dt <- list(dt1 = dt1, dt2 = dt2)

如果yz 为负数,则强制为0。我是这样实现的:

naming <- c("y","z")
for (i in seq_along(naming)){
   list_dt[[i]] <- setDT( list_dt[[i]] )[ noquote(naming[i]) < 0, noquote(naming[i]) := 0  ] 
}

但它不起作用。我看到问题可能是由于函数noquote(),但我不知道为什么。任何建议表示赞赏!

【问题讨论】:

    标签: r dplyr data.table tidyverse


    【解决方案1】:

    使用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】:
      lapply(list_dt,
             function(.x){
               .x[, lapply(.SD,
                           function(x) fifelse(x<0, 0, x)) , 
                  by = "x"]     
             }
      )    
      

      【讨论】:

        【解决方案3】:

        根据您的代码,可以更正为

        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]))] 
        }
        

        【讨论】:

          【解决方案4】:

          使用dplyrpurrr 的选项可以是:

          map(.x = list_dt, 
              ~ .x %>%
               mutate(across(any_of(c("y", "z")), ~ pmax(., 0))))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-09-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-12-10
            • 1970-01-01
            • 1970-01-01
            • 2014-11-12
            相关资源
            最近更新 更多