【问题标题】:How to apply a function to every row of a list of tibbles in R?如何将函数应用于 R 中小标题列表的每一行?
【发布时间】:2020-08-08 11:15:12
【问题描述】:

我有 20 个不同的小标题(称为 N1 到 N20),每个小标题在 R 中都有 9 列和大约 200 万行。

在第 8 列(类型:整数)中,我想更改日期。每个小标题的每列第 8 列中的条目始终相同,始终为数字“14190”

我不想写:

N1[,8] <- lapply(N1[,8], function(x) format(as.Date(as.numeric(x),origin="1970-01-01"), "%Y-%m-%d"))
N2[,8] <- lapply(N2[,8], function(x) format(as.Date(as.numeric(x),origin="1970-01-01"), "%Y-%m-%d"))
N3[,8] <- lapply(N3[,8], function(x) format(as.Date(as.numeric(x),origin="1970-01-01"), "%Y-%m-%d"))
...
N20[,8] <- lapply(N20[,8], function(x) format(as.Date(as.numeric(x),origin="1970-01-01"), "%Y-%m-%d"))

我的第一个想法是从 N1-N20 设置一个列表,但后来我的函数出现问题,因为它需要整数作为参数。

有什么快速的解决方法吗?也许没有 lapply?

谢谢!

【问题讨论】:

    标签: r date lapply


    【解决方案1】:

    首先。您不需要在 df 的行上循环(= lapply)来转换列。第二。转换所有 20 个 df 可以这样实现:

    N1 <- N2 <- data.frame(col1 = runif(10), col2 = rep(14190, 10))
           
    lapply(1:2, function(x) { d <- get(paste0("N", x)); d[[2]] <- format(as.Date(as.numeric(d[[2]]),origin="1970-01-01"), "%Y-%m-%d"); d })
    #> [[1]]
    #>         col1       col2
    #> 1  0.6086402 2008-11-07
    #> 2  0.2982811 2008-11-07
    #> 3  0.7500646 2008-11-07
    #> 4  0.7203713 2008-11-07
    #> 5  0.4445544 2008-11-07
    #> 6  0.7837107 2008-11-07
    #> 7  0.2335820 2008-11-07
    #> 8  0.2021103 2008-11-07
    #> 9  0.1840012 2008-11-07
    #> 10 0.7598002 2008-11-07
    #> 
    #> [[2]]
    #>         col1       col2
    #> 1  0.6086402 2008-11-07
    #> 2  0.2982811 2008-11-07
    #> 3  0.7500646 2008-11-07
    #> 4  0.7203713 2008-11-07
    #> 5  0.4445544 2008-11-07
    #> 6  0.7837107 2008-11-07
    #> 7  0.2335820 2008-11-07
    #> 8  0.2021103 2008-11-07
    #> 9  0.1840012 2008-11-07
    #> 10 0.7598002 2008-11-07
    

    【讨论】:

      【解决方案2】:

      在 R 中使用列表让事情变得更容易。具体来说,我们可以列出您的 N 小标题,然后在该列表上使用 lapply

      N1 = iris
      N2 = iris
      
      l = mget(ls(pattern = '^N\\d$'))
      l = lapply(l, transform, Sepal.Length = as.integer(Sepal.Length))
      
      l
      

      另一种基本方法可能是将所有小标题组合成一个小标题。

      l2 = do.call(rbind, c(l, make.row.names = FALSE))
      l2$id = rep(seq_along(l), vapply(l, nrow, 1L))
      l2[, "Sepal.Width"] = as.integer(l2[, "Sepal.Width"])
      
      
      ## with packages
      library(dplyr)
      l %>%
          bind_rows(.id = "ID")%>%
          mutate(Sepal.Width = as.integer(Sepal.Width))
      
      library(data.table)
      rbindlist(l, id = TRUE)[, Sepal.Width := as.integer(Sepal.Width)]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-16
        • 2023-03-17
        • 1970-01-01
        • 2020-02-15
        • 1970-01-01
        相关资源
        最近更新 更多