【问题标题】:Using Apply Functions In Place of For Loop In R在 R 中使用 Apply 函数代替 For 循环
【发布时间】:2013-12-24 20:51:51
【问题描述】:

我正在 R 中推进,并首次成功使用 lapply 在名为 ImportData() 的函数中加载文件。工作函数为:

AllData <- lapply(files, function(i){
    read.csv(i, stringsAsFactors = FALSE)
  })

AllData 是包含 4 个数据框的列表。未来,它将包含更多内容。

我想用 lapply 替换函数中的另外两个 for 循环。第一个是将日期和时间列组合成一个时间戳的循环。 i 让我无法创建应用函数。

  for (i in 1:length(AllData))
   {
    AllData[[i]]$Date <- strptime(paste(AllData[[i]]$Date, AllData[[i]]$Time), "%m/%d/%y %H:%M:%S")
    AllData[[i]] <- AllData[[i]][-2]
    }

最后一个循环是这样的。 names(AllData) 是长度为 4 的字符向量。

  for (i in 1:length(names(AllData)))
  {
    cat("Time Frame: ", names(AllData)[i], "\n")
    trade(AllData[[i]])
  }

在这种情况下让我感到震惊的是 [[i]]。我似乎无法让它在 lapply 中工作。

感谢您的帮助。

【问题讨论】:

    标签: r for-loop apply


    【解决方案1】:

    最好用 xxpply 函数之一替换 for,但最好使用矢量化函数。

    例如,这里不需要使用for,因为操作是矢量化的。所以第一个循环应该写成:

    AllData$Date <- 
             strptime(paste(AllData$Date, AllData$Time), "%m/%d/%y %H:%M:%S")
    

    第二个循环也是这样:

    cat(paste("Time Frame: ", names(AllData), "\n"))
    

    编辑如果你有一个 data.frames 列表,你可以在这里使用循环:

      for (x in seq_along(AllData)){
           x$Date = strptime(paste(x$Date, x$Time), "%m/%d/%y %H:%M:%S")
       }
    

    【讨论】:

    • 感谢您的建议。如果 AllData 是单个数据框,这将起作用。但是,它是 4 个独立数据框的列表,因此没有 AllData$Date。
    • @user2926358 对不起。我编辑我的答案。只需将所有这些都放在lapply 中。但我看到另一个答案正是使用我的矢量化解决方案。
    • 这很棒。谢谢。
    • @agstudy 如果您有一个解决方案,只需将矢量化解决方案放入lapply,我很乐意看到它。我发现我对这个问题的所有其他 lapply 解决方案(除了使用 transform 之外)编码效率很低,以至于它们并不比 OP 的循环更好。
    【解决方案2】:

    对于您的第一个循环,将lapplytransform 结合使用与匿名函数一起使用非常有用。在这种情况下,匿名函数中的x 指的是列表中的一个元素(例如,AllData[[1]]),然后您可以在transform 中使用它。我发现transform 在这里很有用,因为我可以按名称询问列表元素的变量。

    AllData2 = lapply(AllData, function(x) transform(x, Date = strptime(paste(Date, Time), "%m/%d/%y %H:%M:%S"), 
                                  Time = NULL))
    

    我不知道trade 函数来自哪里,所以我不确定你想对第二个循环做什么。如果你澄清一下,我可能会给你一个想法。

    【讨论】:

    • 这很有帮助,而且成功了,谢谢。交易函数是我编写的一个读取数据、执行一些计算并打印结果的函数,它根本不会改变数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多