【问题标题】:R Code optimization with a list使用列表优化 R 代码
【发布时间】:2015-12-29 09:11:01
【问题描述】:

下面是一个简单的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}
}

【问题讨论】:

  • 请包含示例数据集TSDFLISTY
  • 这个问题在codereviews上可能更合适
  • TSDF
  • 列表

标签: r list optimization any


【解决方案1】:

如果我对您的理解正确,以下代码将满足您的需求。 遗憾的是,您的示例数据不包含任何值。因此,我不得不猜测一下。我还将您的列表/向量转换为数据框以使用合并。

#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"]

【讨论】:

    猜你喜欢
    • 2014-05-24
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多