Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于列表的R代码优化_R_List_Optimization_Any - Fatal编程技术网

基于列表的R代码优化

基于列表的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循环:

TSDF的类型为“POSIXct”“POSIXt”,包含时间戳列表。 LISTY是一个带有时间戳及其各自值的列表。 使用下面的FOR循环,我需要遍历TSDF的整个长度,并且无论TSDF中的时间戳在DF中是否可用,我都需要将它的值分配给newval。下面的代码工作得非常好,但如果TSDF太长,则需要很长时间。对如何优化此代码有何建议?提前谢谢。谢谢

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