基于列表的R代码优化
下面是一个简单的for循环: TSDF的类型为“POSIXct”“POSIXt”,包含时间戳列表。 LISTY是一个带有时间戳及其各自值的列表。 使用下面的FOR循环,我需要遍历TSDF的整个长度,并且无论TSDF中的时间戳在DF中是否可用,我都需要将它的值分配给newval。下面的代码工作得非常好,但如果TSDF太长,则需要很长时间。对如何优化此代码有何建议?提前谢谢。谢谢基于列表的R代码优化,r,list,optimization,any,R,List,Optimization,Any,下面是一个简单的for循环: TSDF的类型为“POSIXct”“POSIXt”,包含时间戳列表。 LISTY是一个带有时间戳及其各自值的列表。 使用下面的FOR循环,我需要遍历TSDF的整个长度,并且无论TSDF中的时间戳在DF中是否可用,我都需要将它的值分配给newval。下面的代码工作得非常好,但如果TSDF太长,则需要很长时间。对如何优化此代码有何建议?提前谢谢。谢谢 for(i in 1:length(TSDF)) { if(any(TSDF[[i]]==LISTY[[1]][,"
for(i in 1:length(TSDF))
{
if(any(TSDF[[i]]==LISTY[[1]][,"DATETIMEST"]))
{
newval = LISTY[[1]][which(TSDF[[i]]==LISTY[[1]][,"DATETIMEST"]),"VALUE"]
}
else{newval = oldval}
if(any(TSDF[[i]]==LISTY[[2]][,"DATETIMEST"]))
{
newval = LISTY[[2]][which(TSDF[[i]]==LISTY[[2]][,"DATETIMEST"]),"VALUE"]
}
else{newval = oldval}
}
如果我理解正确,下面的代码将执行您想要的操作。 遗憾的是,您的示例数据不包含任何值。因此,我不得不猜测一下。我还将列表/向量转换为数据帧,以便使用合并
#generate some dummy data
LISTY <- as.data.frame(list(x=as.POSIXct(c("2015-12-19 23:40:04",
"2015-12-20 00:00:02",
"2015-12-20 00:00:13")),
y=as.POSIXct(c("2015-12-20 00:00:17",
"2015-12-20 00:00:22",
"2015-12-20 00:00:27")),
val=c("a","b","c")) )
tsdf.key <- as.POSIXct(c("2015-12-19 23:40:04",
"2015-12-20 00:00:02",
"2015-12-20 00:00:13",
"2015-12-20 00:00:17",
"2015-12-20 00:00:22",
"2015-12-20 00:00:27",
"2015-12-20 00:00:28"))
tsdf.val <- 1:length(tsdf.key)
TSDF <- data.frame(tsdf.key,tsdf.val )
names(TSDF) <- c("key","value")
names(LISTY)<-c("DATETIMEST","RECORDEDTIMESTAMP","value")
# join data on left outer join
merge1<- merge(x=TSDF,y=LISTY,by.x="key",by.y="DATETIMEST",all.x=TRUE)
merge2<- merge(x=merge1,y=LISTY,by.x="key",by.y="RECORDEDTIMESTAMP",all.x=TRUE)
###replace this by value
#populate
names(newval) <- c("newval")
#fill in datetimestamp
selector <- which(!is.na(merge2["value.y"]))
newval <- merge2["value.x"]
newval[selector]
#fill in recordedtimespamp
selector <- which(!is.na(merge2["value.y"]))
newval <- merge2["value.x"]
#生成一些虚拟数据
LISTY请包括示例数据集TSDF
和LISTY
。这个问题可能更适合CodeReviews TSDF LISTY