【问题标题】:Subtract data frames with different number of rows?减去具有不同行数的数据帧?
【发布时间】:2012-04-11 00:28:12
【问题描述】:

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

如果我将这两者叠加在一起,我会得到一个很好的图来显示它们在时间上的差异。

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

检查这个例子:

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

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

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

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

    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
    

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

    【讨论】:

    • 谢谢你!非常可接受的解决方案 :) 我想到了这样的事情,但我不知道如何在不创建 for 循环的情况下实现它。
    猜你喜欢
    • 2019-11-11
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 2017-04-20
    • 2019-08-08
    • 1970-01-01
    相关资源
    最近更新 更多