我正在推进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工作。
感谢您的帮助。
答案 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)
对于第一个循环,将lapply
与transform
结合使用与匿名函数一起使用非常有用。在这种情况下,匿名函数中的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
函数的来源,所以我不确定你想用第二个循环做什么。如果你澄清我可能会给你一个想法。