繁体   English   中英

在R中使用Apply函数代替For循环

[英]Using Apply Functions In Place of For Loop In R

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

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

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

我要用lapply替换的函数中还有两个for循环。 第一个是将“日期”和“时间”列合并为一个时间戳的循环。 我在创建apply函数时让我失望。

  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]]。 我似乎无法正常工作。

谢谢您的帮助。

这是很好的使用代替for由xxpply功能之一,但更好的方法是使用矢量功能。

例如,在这里,因为操作是矢量化的,所以不需要使用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")
   }

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

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

我不知道trade功能来自哪里,所以我不确定您想对第二个循环做什么。 如果您澄清,我也许可以给您一个想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM