【问题标题】:Roll join with no duplicates in RR中没有重复的滚动连接
【发布时间】: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_numbertimepointy 组合的重复项会更好吗?
  • 您应该在示例数据中包含该场景。但是,是的,总的来说,您需要一个标识符来指示结果来自连接。我忘记了滚动连接是如何处理不匹配的,但您可能会在重复调用的同时查找 is.na(key)

标签: r dplyr data.table


【解决方案1】:

这就是我最终做的事情,我不认为它很棒,但据我所知,它按预期工作。

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, .))

哪个产生

    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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 2012-08-15
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    相关资源
    最近更新 更多