滚动连接,在R中没有重复项
我有两个表,它们来自收集不同采样频率数据的设备。一个设备每30秒采样一次,另一个大约30秒,有时会丢失测量值(示例序列可能是滚动连接,在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
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