【发布时间】:2020-11-13 22:06:42
【问题描述】:
我有两张表来自收集不同采样频率的数据的设备。一台设备每 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
如果我尝试就近加入,我会得到
# set the keys
data.table::setkey(data.table::setDT(q1), key, joint_time)
data.table::setkey(data.table::setDT(q2), key, joint_time)
q2[q1, roll="nearest"]
注意第 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
我的理想输出将按最近的方式加入,但用NA 填充,而不是在y 值上重复。
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,或者是否必须在后完成。
【问题讨论】:
-
这些必须是单独的步骤。第 4 行和第 6 行 是唯一的 - 它们具有不同的键。
-
@Cole 很高兴分两步完成,有什么建议吗?行是唯一的,
y上的值是重复的。 -
res[duplicated(res, by = c('timepoint', 'y')) | duplicated(res, by = c('timepoint', 'y'), fromLast = TRUE), `:=`(timepoint = NA_real_, y = NA_real_)]我想。 -
稍作修改,
res[duplicated(res, by = c('timepoint', 'y')),:=(timepoint = NA_real_, y = NA_real_)]似乎适用于这种特殊情况。但是,如果相同的y值稍后出现在data.frame上,这将如何表现,不是因为它被放在那里购买卷,而是因为它确实发生在数据中。假设这会起作用是不安全的,创建某种sample_number标识符并查找sample_number、timepoint和y组合的重复项会更好吗? -
您应该在示例数据中包含该场景。但是,是的,总的来说,您需要一个标识符来指示结果来自连接。我忘记了滚动连接是如何处理不匹配的,但您可能会在重复调用的同时查找
is.na(key)。
标签: r dplyr data.table