gpt4 book ai didi

R:在时间相关的数据框中查找并添加缺失(/不存在)的行

转载 作者:行者123 更新时间:2023-12-03 20:23:41 26 4
gpt4 key购买 nike

我正在努力解决以下问题。

如果有一个(大)数据框,如下:

  • 列组合是“唯一”组合的几列,例如 ID
  • 时间相关专栏
  • 一测相关栏目

  • 我想确保对于每个时间间隔的每个唯一 ID,数据框中都有一个度量值。如果不是,我想为该时间/ID 添加 0(或 NA)度量。

    为了说明问题,创建以下 test数据框:
    test <- data.frame(
    YearWeek =rep(c("2012-01","2012-02"),each=4),
    ProductID =rep(c(1,2), times=4),
    CustomerID =rep(c("a","b"), each=2, times=2),
    Quantity =5:12
    )[1:7,]

    YearWeek ProductID CustomerID Quantity
    1 2012-01 1 a 5
    2 2012-01 2 a 6
    3 2012-01 1 b 7
    4 2012-01 2 b 8
    5 2012-02 1 a 9
    6 2012-02 2 a 10
    7 2012-02 1 b 11

    第 8 行被故意省略了。通过这种方式,我模拟了时间值“2012-02”的 ID '2-b'( Quantity )的“缺失值”(缺失 ProductID-CustomerID)。

    我想要做的是调整 data.frame 的所有时间值(这些是已知的,在本例中只是“2012-01”和“2012-02”),对于所有 ID 组合(这些是事先未知,但这是“数据框中的所有唯一 ID 组合”,因此是 ID 列上的唯一设置),数据框中有一个 Quantity。

    这应该是这个例子的结果(如果我们选择 NA 作为缺失值,通常我想控制它):
      YearWeek ProductID CustomerID Quantity
    1 2012-01 1 a 5
    2 2012-01 2 a 6
    3 2012-01 1 b 7
    4 2012-01 2 b 8
    5 2012-02 1 a 9
    6 2012-02 2 a 10
    7 2012-02 1 b 11
    8 2012-02 2 b NA

    最终目标是为这些 ID 组合创建时间序列,因此我希望拥有所有时间值的数量。我需要进行不同的聚合(按时)并使用来自大数据集的不同级别的 ID

    我尝试了几种方法,例如 meltcast来自 reshape包裹。但到目前为止我还没有做到。下一步是创建一个带有 for 循环等的函数,但从性能的角度来看,这并不是很有用。

    也许有一种更简单的方法可以立即创建时间序列,提供像 test 这样的 data.frame .有人对这个有想法吗??

    提前致谢!

    请注意,在实际问题中,有两个以上的“ID 列”。

    编辑:

    我应该进一步描述这个问题。 “时间”列和“ID”列之间存在差异。 对这个问题的第一个(而且很棒!)答案乔兰 ,也许没有从我想要的东西中得到清晰的理解(我给出的例子并没有清楚地说明区别)。我上面说:

    for all ID-combinations (these are not known upfront, but this is 'all unique ID combinations in the data frame', thus the unique set on the ID columns)



    所以我不想要“所有可能的 ID 组合”,而是“数据中的所有 ID 组合”。
    对于这些组合中的每一个,我都希望每个唯一的时间值都有一个值。

    让我通过扩展 test 说清楚至 test2 , 如下
    > test2 <- rbind(test, c("2012-02", 3, "a", 13))
    > test2
    YearWeek ProductID CustomerID Quantity
    1 2012-01 1 a 5
    2 2012-01 2 a 6
    3 2012-01 1 b 7
    4 2012-01 2 b 8
    5 2012-02 1 a 9
    6 2012-02 2 a 10
    7 2012-02 1 b 11
    8 2012-02 3 a 13

    这意味着我希望在结果数据框中没有 '3-b' ID 组合,因为这个组合不在 test2 之内。 .如果我使用第一个答案的方法,我将得到以下结果:
    > vals2 <- expand.grid(YearWeek = unique(test2$YearWeek),
    ProductID = unique(test2$ProductID),
    CustomerID = unique(test2$CustomerID))

    > merge(vals2,test2,all = TRUE)
    YearWeek ProductID CustomerID Quantity
    1 2012-01 1 a 5
    2 2012-01 1 b 7
    3 2012-01 2 a 6
    4 2012-01 2 b 8
    5 2012-01 3 a <NA>
    6 2012-01 3 b <NA>
    7 2012-02 1 a 9
    8 2012-02 1 b 11
    9 2012-02 2 a 10
    10 2012-02 2 b <NA>
    11 2012-02 3 a 13
    12 2012-02 3 b <NA>

    所以我不想要行 612到这里。

    为了克服这个问题,我在下面找到了一个解决方案。在这里,我拆分了“唯一时间列”和“唯一 ID 组合”。因此,与上面的区别在于“组合”一词,并不是每个 ID 列都是唯一的。
    > temp_merge <- merge(unique(test2["YearWeek"]),
    unique(test2[c("ProductID", "CustomerID")]))

    > merge(temp_merge,test2,all = TRUE)
    YearWeek ProductID CustomerID Quantity
    1 2012-01 1 a 5
    2 2012-01 1 b 7
    3 2012-01 2 a 6
    4 2012-01 2 b 8
    5 2012-01 3 a <NA>
    6 2012-02 1 a 9
    7 2012-02 1 b 11
    8 2012-02 2 a 10
    9 2012-02 2 b <NA>
    10 2012-02 3 a 13

    对此有何评论?

    这是一种优雅的方式,还是有更好的方式?

    最佳答案

    使用 expand.gridmerge :

    vals <- expand.grid(YearWeek = unique(test$YearWeek),
    ProductID = unique(test$ProductID),
    CustomerID = unique(test$CustomerID))
    > merge(vals,test,all = TRUE)
    YearWeek ProductID CustomerID Quantity
    1 2012-01 1 a 5
    2 2012-01 1 b 7
    3 2012-01 2 a 6
    4 2012-01 2 b 8
    5 2012-02 1 a 9
    6 2012-02 1 b 11
    7 2012-02 2 a 10
    8 2012-02 2 b NA
    NA s 可以在事后替换为您使用子集和 is.na 选择的任何值.

    关于R:在时间相关的数据框中查找并添加缺失(/不存在)的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9996452/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com