如何根据两个不同列中的匹配项来复制数据

时间:2019-06-28 01:56:39

标签: r

我有以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

2 个答案:

答案 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")