滚动连接,在R中没有重复项

滚动连接,在R中没有重复项,r,dplyr,data.table,R,Dplyr,Data.table,我有两个表,它们来自收集不同采样频率数据的设备。一个设备每30秒采样一次,另一个大约30秒,有时会丢失测量值(示例序列可能是31、61、95、151,请注意它是如何在约120秒时丢失采样的)。我的原始data.frame包含一个datetime,而不是秒数,但是玩具数据应该可以用来说明 q1 <- read.table(text=" A 0 1.1 A 30 1.2 A 90 1.3

我有两个表,它们来自收集不同采样频率数据的设备。一个设备每30秒采样一次,另一个大约30秒,有时会丢失测量值(示例序列可能是
31、61、95、151
,请注意它是如何在约120秒时丢失采样的)。我的原始
data.frame
包含一个
datetime
,而不是秒数,但是玩具数据应该可以用来说明

q1 <-
read.table(text="
           A    0   1.1
           A    30  1.2
           A    90  1.3
           A    120 1.4
           B    15  -5
           B    45  -3
           B    75  -3.5
           C    10  0
           C    40  -1.4
           C    70  -1")

q2 <-
  read.table(text="
           A    10  10.1
           A    40  10.2
           A    110 10.4
           B    30  -50
           B    90  -30
           C    5   0
           C    35  -10.4
           C    76  -10")

names(q1) <- c("key","datetime","x")
names(q2) <- c("key","timepoint","y")

# create a joint_time to keep the originals in place
q1$joint_time <- q1$datetime
q2$joint_time <- q2$timepoint

注意第4行和第6行的重复项

    key timepoint     y joint_time datetime    x
 1:   A        10  10.1          0        0  1.1
 2:   A        40  10.2         30       30  1.2
 3:   A       110  10.4         90       90  1.3
 4:   A       110  10.4        120      120  1.4
 5:   B        30 -50.0         15       15 -5.0
 6:   B        30 -50.0         45       45 -3.0
 7:   B        90 -30.0         75       75 -3.5
 8:   C         5   0.0         10       10  0.0
 9:   C        35 -10.4         40       40 -1.4
10:   C        76 -10.0         70       70 -1.0
我的理想输出是按最近值合并,但在
y
值上填充
NA
,而不是重复

    key timepoint     y joint_time datetime    x
 1:   A        10  10.1          0        0  1.1
 2:   A        40  10.2         30       30  1.2
 3:   A       110  10.4         90       90  1.3
 4:   A        NA    NA        120      120  1.4
 5:   B        30 -50.0         15       15 -5.0
 6:   B        NA    NA         45       45 -3.0
 7:   B        90 -30.0         75       75 -3.5
 8:   C         5   0.0         10       10  0.0
 9:   C        35 -10.4         40       40 -1.4
10:   C        76 -10.0         70       70 -1.0

我可以先进行连接,然后找到重复项并将其更改为NA。稍后我将尝试在那里插入
y
变量。不确定是否有直接的方法进行连接并使用
NA
填充,或者是否必须事后进行。

以下是我最后所做的,我认为这并不可怕,但据我所知,它正在按预期工作

q1$joint_time <- q1$datetime
q2$joint_time <- q2$timepoint
# create a sample id using the key since the data is grouped
q2$sample_id <- paste0(q2$key, as.character(1:nrow(q2)))

# Join
res <- q2[q1, roll="nearest"]
# fill with NAs
res %>% mutate_at(vars(y,timepoint), ~ifelse(duplicated(sample_id), NA, .))

这就是我最后所做的,我不认为这是了不起的,但就我所能看到的,它正在按预期工作

q1$joint_time <- q1$datetime
q2$joint_time <- q2$timepoint
# create a sample id using the key since the data is grouped
q2$sample_id <- paste0(q2$key, as.character(1:nrow(q2)))

# Join
res <- q2[q1, roll="nearest"]
# fill with NAs
res %>% mutate_at(vars(y,timepoint), ~ifelse(duplicated(sample_id), NA, .))

这些必须是单独的步骤。第4行和第6行是唯一的-它们有不同的键。@Cole很乐意分两步完成,有什么建议吗?行是唯一的,
y
上的值是重复的。
res[duplicated(res,by=c('timepoint','y'));duplicated(res,by=c('timepoint','y'),fromLast=TRUE),`:=`(timepoint=NA\u real,y=NA\u real\uu)]
我想。稍微修改一下,
res duplicated(res,by=c('timepoint','y'),
(时间点=不真实,y=不真实)]
似乎在这种特殊情况下起作用。但是,如果相同的
y
值后来出现在
数据上,这种情况会发生什么呢。frame
不是因为它被放在那里,而是因为它确实发生在数据中。假设这会起作用是不安全的,是否最好创建某种
示例编号
ide指定并查找
sample\u number
timepoint
y
组合的重复项?您应该在示例数据中包含该场景。但是,是的,总的来说,您需要一个标识符来指示结果来自联接。我忘记了滚动联接如何处理不匹配项,但您可能会发现可以将
is.na(key)
与复制调用一起使用。这些必须是单独的步骤。第4行和第6行是唯一的-它们有不同的键。@Cole很乐意分两步执行,有什么建议吗?行是唯一的,
y
上的值是复制的。
res[复制(res,by=c('timepoint','y'))|复制(res by=c('timepoint','y'),fromLast=TRUE),`:=`(timepoint=NA_real,y=NA_real)
我想。稍微修改一下,
res[replicated(res,by=c('timepoint','y'),
:=
(timepoint=NA_real,y=NA_real)]
似乎在这种特殊情况下起作用。但是,如果相同的
y
值后来出现在
数据上,这种情况会发生什么呢。frame
不是因为它被放在那里,而是因为它确实发生在数据中。假设这会起作用是不安全的,是否最好创建某种
示例编号
ide指定并查找
sample\u number
timepoint
y
组合的重复项?您应该在示例数据中包含该场景。但是,是的,总的来说,您需要一个标识符来指示结果来自联接。我忘记了滚动联接如何处理不匹配项,但您可能会发现
is.na(key)
以及重复调用的ok。
    key timepoint     y joint_time sample_id datetime    x
 1:   A        10  10.1          0        A1        0  1.1
 2:   A        40  10.2         30        A2       30  1.2
 3:   A       110  10.4         90        A3       90  1.3
 4:   A        NA    NA        120        A3      120  1.4
 5:   B        30 -50.0         15        B4       15 -5.0
 6:   B        NA    NA         45        B4       45 -3.0
 7:   B        90 -30.0         75        B5       75 -3.5
 8:   C         5   0.0         10        C6       10  0.0
 9:   C        35 -10.4         40        C7       40 -1.4
10:   C        76 -10.0         70        C8       70 -1.0