首页 文章

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

提问于
浏览
1

我在R中继续前进,并且在第一次成功地使用lapply加载一个名为ImportData()的函数中的文件 . 工作职能是:

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

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

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

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 回答

  • 5

    对于第一个循环,将 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 函数来自哪里,所以我不确定你想要用第二个循环做什么 . 如果你澄清我可能会给你一个想法 .

  • 2

    最好使用xxpply函数之一替换 for ,但更好的方法是使用矢量化函数 .

    例如,由于操作是矢量化的,因此不需要使用 for . 所以应该写第一个循环:

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

    第二个循环也是一样:

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

    EDIT 如果您有data.frames列表,可以在此处使用循环:

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

相关问题