加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

R data.table滚动连接“mult”未按预期工作

发布时间:2021-02-28 14:12:09 所属栏目:编程 来源:网络整理
导读:我有两个data.frames,每个都有一个时刻序列.我的方针是行使df2的时刻序列来标志df1中最靠近的时刻戳. df2中的每个时刻戳只应在df1中标志一个时刻戳! dates1 - as.POSIXct(c("2015-10-26 12:00:00","2015-10-26 13:00:00","2015-10-26 14:00:00"))values1 - c

我有两个data.frames,每个都有一个时刻序列.我的方针是行使df2的时刻序列来标志df1中最靠近的时刻戳. df2中的每个时刻戳只应在df1中标志一个时刻戳!

dates1 <-  as.POSIXct(c("2015-10-26 12:00:00","2015-10-26 13:00:00","2015-10-26 14:00:00"))
values1 <- c("a","b","c")

dates2 <- as.POSIXct(c("2015-10-26 12:05:00","2015-10-26 13:55:00"))
values2 <- c("A","C")

df1 <- data.frame(dates1,values1)
df2 <- data.frame(dates2,values2)

祈望的功效:

dates2 values2 values1
1: 2015-10-26 12:00:00       A       a
2: 2015-10-26 13:00:00       NA      b
3: 2015-10-26 14:00:00       C       c

为了实现这一点,我将data.frames转换为data.tables并行使转动毗连“最近”,如下所示:

dt1 <- data.table(df1)
dt2 <- data.table(df2)

setkey(dt1,"dates1")
setkey(dt2,"dates2")

dt3 <- dt2[dt1,roll = "nearest"]

                dates2 values2 values1
1: 2015-10-26 12:00:00       A       a
2: 2015-10-26 13:00:00       A       b
3: 2015-10-26 14:00:00       C       c

值2“A”行使两次,一次用于12:00时刻戳,一次用于13:00.我但愿每个value2只行使一次,并查阅data.table手册我但愿行使选项mult =“first”来办理这个题目.

dt3 <- dt2[dt1,roll = "nearest",mult = "first"]

这导致沟通的输出,“A”行使两次.我的错误在那边?

办理要领

当运行dt2 [dt1,roll =“nearest”]时,你根基上是说“行使键将df2中的行按照最近的毗连返回到dt1中的每一行.以是

> dt2中第一行中的dates2最靠近dt1中第一行中的dates1
> dt2中第一行中的dates2最靠近dt1中第二行中的dates1
> dt2中第二行中的dates2最靠近dt1中第三行中的dates1

因此,

dt2[dt1,roll = "nearest"]
#                 dates2 values2 values1
# 1: 2015-10-26 12:00:00       A       a
# 2: 2015-10-26 13:00:00       A       b
# 3: 2015-10-26 14:00:00       C       c

这是来自dt1的全部行以及来自dt2的毗连值2.

相反,我们但愿以相反的方法插手,即“行使密钥按照dt2中每行的最近毗连从dt2中提取值2,并更新dt1中的匹配行”,即

dt1[dt2,values2 := i.values2] 
dt1
#                 dates1 values1 values2
# 1: 2015-10-26 12:00:00       a       A
# 2: 2015-10-26 13:00:00       b      NA
# 3: 2015-10-26 14:00:00       c       C

一些特另外声名

>您不必要先包装到data.frame然后再包装到data.table,您只必要执行dt1< - data.table(dates1,values1)等.
>在行使它时,您可以行使要害参数data.table动态配置密钥,即dt1< - data.table(dates1,values1,key =“dates1”)等.
>可能你可以一路跳过配置键并改为行使(V 1.9.6),即dt1 [dt2,roll =“nearest”,values2:= i.values2,on = c(dates1 =“dates2”)]
>最后,请不要建造不须要的副本,譬喻,而不是< - 和data.table(df)行使:=和setDT(df),有关具体信息,请参阅here

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读