减去不同行数的数据帧?

时间:2012-04-11 00:28:13

标签: r dataframe

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

如果我把这两者放在一起,我会得到一个很好的情节,显示它们在时间上的差异。

现在我希望得到这两个数据帧的时间绝对差异,以制作另一个图表,显示它们有多大差异(或创建一个包含此信息的箱线图),即使它们没有相同的长度和完全匹配时间戳。

检查此示例:

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相同的时间戳,但它们的时间戳都在同一时间范围内。

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

1 个答案:

答案 0 :(得分: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

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