使用应用函数代替R中的For循环

时间:2013-12-24 20:51:52

标签: r for-loop apply

我正在推进R并且已经成功地在一个名为ImportData()的函数中加载文件时使用了lapply。工作职能是:

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

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

我想用lapply替换函数中还有两个for循环。第一个是将日期和时间列组合成一个时间戳的循环。我正在抛弃我创建应用功能。

  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工作。

感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

最好使用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")
   }

答案 1 :(得分: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函数的来源,所以我不确定你想用第二个循环做什么。如果你澄清我可能会给你一个想法。