4

我有两个数据框,每个数据框有两列。第一列是时间戳,第二列包含一些值。其中一个数据帧比另一个大得多,但它们都包含相同时间戳范围内的数据。

如果我将这两个绘制在彼此之上,我会得到一个很好的图来展示它们在时间上的差异。

现在我想获得这两个数据帧的时间绝对差异,以制作另一个图,显示它们的差异程度(或使用此信息创建一个箱线图),即使它们没有相同的长度和精确匹配的时间戳。

检查这个例子:

df1:

timestamp | data
1334103075| 1.2
1334103085| 1.5
1334103095| 0.9
1334103105| 0.7
1334103115| 1.1
1334103125| 0.8

df2:

timestamp | data
1334103078| 1.2
1334103099| 1.5
1334103123| 0.8
1334103125| 0.9

我将如何实现这样的目标:

df3 <- abs(df1-df2)

如您所见,df2 的时间戳可能与 df1 不同,但它们的时间戳都在相同的时间范围内。

当然,减法应该尝试匹配时间戳或从它们附近的时间戳平均值中减去值。

4

1 回答 1

3

我建议使用两个线性插值器,并根据您的两组时间戳对它们进行评估:

df1 <- data.frame(timestamp = c(1334103075, 1334103085, 1334103095,
                                1334103105, 1334103115, 1334103125),
                  data      = c(1.2, 1.5, 0.9, 0.7, 1.1, 0.8))

df2 <- data.frame(timestamp = c(1334103078, 1334103099, 1334103123,
                                1334103125),
                  data      = c(1.2, 1.5, 0.8, 0.9))

library(Hmisc)
all.timestamps <- sort(unique(c(df1$timestamp, df2$timestamp)))
data1 <- approxExtrap(df1$timestamp, df1$data, all.timestamps)$y
data2 <- approxExtrap(df2$timestamp, df2$data, all.timestamps)$y

df3 <- data.frame(timestamp = all.timestamps,
                  data1     = data1,
                  data2     = data2,
                  abs.diff  = abs(data1 - data2))
df3
#    timestamp data1    data2   abs.diff
# 1 1334103075  1.20 1.157143 0.04285714
# 2 1334103078  1.29 1.200000 0.09000000
# 3 1334103085  1.50 1.300000 0.20000000
# 4 1334103095  0.90 1.442857 0.54285714
# 5 1334103099  0.82 1.500000 0.68000000
# 6 1334103105  0.70 1.325000 0.62500000
# 7 1334103115  1.10 1.033333 0.06666667
# 8 1334103123  0.86 0.800000 0.06000000
# 9 1334103125  0.80 0.900000 0.10000000

如果您对线性近似不太满意,那么您可以考虑拟合样条曲线。

于 2012-04-11T00:49:38.167 回答