【问题标题】:How do I deduplicate but control for a condition in R?如何删除重复但控制 R 中的条件?
【发布时间】:2016-02-22 05:08:35
【问题描述】:

我有一个包含两列 yearmon 和 x 的数据框。 yearmon 有多个条目。有些在 x 列中有相应的信息,有些则有 NA。

例如,如果 2001 年 1 月的其中一个条目在 x 列中有数据,我想保留该行,但删除 2001 年 1 月的其他行,其中包含 NA。但是,如果 2001 年 1 月的条目中没有 x 列中的数据,我想保留 NA 列。我尝试了去重、唯一、合并、聚合,但都没有运气。

这是我要求的数据样本:

      Yearmon     Price
1   2001-01-01        NA
2   2001-01-01  188000.0
3   2001-02-01        NA
4   2001-02-01  250000.0
5   2001-03-01        NA
6   2001-03-01  250000.0
7   2001-04-01        NA
8   2001-05-01        NA
9   2001-05-01  325000.0
10  2001-06-01        NA
11  2001-06-01  375000.0
12  2001-07-01        NA
13  2001-08-01        NA
14  2001-09-01        NA
15  2001-10-01        NA
16  2001-11-01        NA
17  2001-11-01  305000.0
18  2001-12-01        NA
19  2001-12-01  360000.0

【问题讨论】:

  • 您能否提供您的代码/数据示例
  • 如果您不确定如何操作:阅读this
  • 我添加了数据 colin 谢谢

标签: r merge dataframe


【解决方案1】:

因为您在每个组的开头使用NAs 对数据进行了排序,所以您应该能够使用 run-length-encoding 来计算您希望保留的行的索引:

> df[cumsum(rle(as.integer(df$Yearmon))$lengths),]
      Yearmon  Price
2  2001-01-01 188000
4  2001-02-01 250000
6  2001-03-01 250000
7  2001-04-01     NA
9  2001-05-01 325000
11 2001-06-01 375000
12 2001-07-01     NA
13 2001-08-01     NA
14 2001-09-01     NA
15 2001-10-01     NA
17 2001-11-01 305000
19 2001-12-01 360000

使用by 的版本要慢得多,但更易读:

do.call(rbind, by(df, df$Yearmon, tail, 1))

【讨论】:

    猜你喜欢
    • 2018-08-06
    • 2022-11-10
    • 2016-08-16
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 2015-03-12
    • 2012-12-22
    相关资源
    最近更新 更多