我有以12.5Hz采样的加速度计数据。对于一个数据集(X1),我已将这些数据点压缩为1秒间隔,但现在需要与另一列(X2)(以12.5Hz采样)重新组合,以生成一个方程。如果时间数据与X2匹配,我想复制X1中的值
我的文件当前看起来像这样
X1
Time Accx1
2019-03-28 07:47:07 5
2019-03-28 07:47:08 1
2019-03-28 07:47:09 7
X2
Time Accx2
2019-03-28 07:47:07 2
2019-03-28 07:47:07 8
2019-03-28 07:47:07 1
2019-03-28 07:47:07 9
2019-03-28 07:47:07 1
2019-03-28 07:47:07 1
2019-03-28 07:47:07 2
2019-03-28 07:47:07 3
2019-03-28 07:47:07 1
And I want them to look like this:
Time Accx1 Accx2
2019-03-28 07:47:07 5 2
2019-03-28 07:47:07 5 8
2019-03-28 07:47:07 5 1
2019-03-28 07:47:07 5 9
2019-03-28 07:47:07 5 1
2019-03-28 07:47:07 5 1
2019-03-28 07:47:07 5 2
2019-03-28 07:47:07 5 3
2019-03-28 07:47:07 5 1
答案 0 :(得分:0)
我相信您正在寻找合适的加入。这应该起作用:
merge(X1, X2, by = "Time", all.x = FALSE, all.y = TRUE)
答案 1 :(得分:0)
merge
(以及大多数类似join
的运算符)在您的时间具有亚秒分辨率时可能无法正常工作。这与任何浮点都有关(有关浮点,请参见R FAQ 7.31),其中连续变量之间的相等测试是有问题的。
为此,我建议按范围查找。可以使用cut
或(我在这里的建议)findInterval
完成。在此示例中,为了展示一些有趣的内容,我更改了X2
的三个时间:即显示一些不同的匹配项和不匹配项(超出范围)。
假设:X1$Time
不变。 $Time
属于POSIXct
类(因此可能比“ 1秒”更为坚决)。
( ind <- findInterval(X2$Time, X1$Time) )
# [1] 0 1 1 1 1 1 1 2 2
### that "0" is a problem, fix it
ind[ind < 1] <- NA
X2$Accx1 <- X1$Accx1[ ind ]
X2
# Time Accx2 Accx1
# 1 2019-03-28 07:47:06 2 NA # this is b/c the ":06" is before X1 starts
# 2 2019-03-28 07:47:07 8 5
# 3 2019-03-28 07:47:07 1 5
# 4 2019-03-28 07:47:07 9 5
# 5 2019-03-28 07:47:07 1 5
# 6 2019-03-28 07:47:07 1 5
# 7 2019-03-28 07:47:07 2 5
# 8 2019-03-28 07:47:08 3 1
# 9 2019-03-28 07:47:08 1 1
ind[ind < 1]
步骤是因为在第一个X1$Time
之前发生的实例将获得一个0
,这会缩短返回值(错误:replacement has 8 rows, data has 9
)。通过用NA
替换它们,至少替换向量
数据,略有修改(添加/删除_
)以便于读入。
X1 <- read.table(header=TRUE, stringsAsFactors=FALSE, text="
Time Accx1
2019-03-28_07:47:07 5
2019-03-28_07:47:08 1
2019-03-28_07:47:09 7")
X1$Time <- as.POSIXct(X1$Time, format = "%Y-%m-%d_%H:%M:%S")
X2 <- read.table(header=TRUE, stringsAsFactors=FALSE, text="
Time Accx2
2019-03-28_07:47:06 2
2019-03-28_07:47:07 8
2019-03-28_07:47:07 1
2019-03-28_07:47:07 9
2019-03-28_07:47:07 1
2019-03-28_07:47:07 1
2019-03-28_07:47:07 2
2019-03-28_07:47:08 3
2019-03-28_07:47:08 1")
X2$Time <- as.POSIXct(X2$Time, format = "%Y-%m-%d_%H:%M:%S")