【发布时间】:2016-02-15 03:01:15
【问题描述】:
我在这个任务上苦苦挣扎了很长一段时间,因此我想我会寻求你的帮助。
在 df1 中,我尝试根据 df1 中的信息以及 df2 中的信息添加一个新列。所以在 df2 中,只要 dfs 中的位置匹配并且 df2 中的时间戳在 df1 给定的时间间隔内,就应该创建一个 ID 列,否则返回0。问题是它们的长度不等。我知道如何编写一个嵌套的 for 循环,但它很丑陋并且需要永远运行。我尝试使用 sapply 作为类似问题的解决方案,但由于 df 长度不同而无法运行
我找到了这个线程 [Speed up the loop operation in R,但是因为我的条件句所依据的 dfs 的长度不同,我无法让这个解决方案起作用。
这是我的数据:
df1 <- structure(list(ID = c(NA, NA, 10035010L), location = c("barge",
"barge", "barge"), start = structure(c(NA, NA,
1427301960), class = c("POSIXct", "POSIXt"), tzone = ""), end = structure(c(NA,
NA, 1437418440), class = c("POSIXct", "POSIXt"), tzone = "")), .Names = c("ID",
"location", "start", "end"), row.names = c(NA, 3L), class = "data.frame")
df2<-structure(list(time = structure(c(1419062220, 1419063120, 1427325120,
1427325240, 1427325360, 1427325540, 1427325660, 1427326680, 1427568960,
1427569320, 1427569500), class = c("POSIXct", "POSIXt"), tzone = ""),
location = c("barge", "barge", "barge",
"barge", "barge", "barge", "barge",
"barge", "barge", "barge", "barge"
)), row.names = c(222195L, 222196L, 186883L, 186884L, 186885L,
186886L, 186887L, 186888L, 186930L, 186931L, 186932L), class = "data.frame", .Names = c("time",
"location"))
更新:我决定使用 dplyr 包,因为我觉得使用它很舒服,并在我更大的数据集上使用它。但是,当我包含站 ID 时,由于不同位置的输出不一致,因此出现了问题。
考虑包含站点的相同但略有修改的数据集以查看结果差异:
df3<-structure(list(time = structure(c(1419061860, 1419062220, 1419063120,
1427325120, 1427325240, 1427325360, 1427325540, 1427325660, 1427326680,
1427568960, 1427569320), class = c("POSIXct", "POSIXt"), tzone = ""),
station = c(104667L, 104667L, 104667L, 124083L, 124083L,
124083L, 124083L, 124083L, 124083L, 124083L, 124083L), location = c("barge",
"barge", "barge", "barge", "barge",
"barge", "barge", "barge", "barge",
"barge", "barge")), row.names = 879:889, class = "data.frame", .Names = c("time", "station", "location"))
和
df4<-structure(list(station = c(124083L, 113071L), location = c("barge",
"barge"), ID = c(10035010L, NA), start = structure(c(1427301960,
NA), class = c("POSIXct", "POSIXt"), tzone = ""), end = structure(c(1437418440,
NA), class = c("POSIXct", "POSIXt"), tzone = "")), row.names = 3:4, class = "data.frame", .Names = c("station",
"location", "ID", "start", "end"))
当我运行 dplyr 解决方案时,
df3 %>% left_join(., df4) %>%
mutate(ID = ifelse(time >= start & time < end, ID, 0))
它不返回相同的输出,即在第一种情况下,返回的数据集是原始数据的倍数,在最后一种情况下,返回的数据集长度相同。我只是不明白为什么它不同。它使使用 filter() 函数变得不可能。任何有关如何解决此问题的建议将不胜感激。谢谢
【问题讨论】:
标签: r loops vectorization