【问题标题】:Conflict resolution when merging rows in R data frame合并 R 数据框中的行时的冲突解决
【发布时间】:2014-10-26 15:28:32
【问题描述】:

我有一个包含宏观经济数据系列的数据框,这些数据系列分为两行,但在许多常见时间点上重叠。

Country   Series    T1  T2  T3  T4  T5  T6  T7  T8  ...
Japan     Series1   10  20  10  30  40  NA  NA  NA  ...
Japan     Series2   NA  NA  NA  35  40  30  30  20  ...
Korea     Series1   70  80  70  70  80  NA  NA  NA  ...
Korea     Series2   NA  NA  NA  70  85  80  75  70  ...

我想将这些行合并为一个,但由于过于复杂而无法进入,第二个系列有时包含重叠时间点的不同值。我想在合并行时保留这些值(并相应地丢弃第一个系列的值)。

Country   Series    T1  T2  T3  T4  T5  T6  T7  T8  ...
Japan     SeriesA   10  20  10  35  40  30  30  20  ...
Korea     SeriesA   70  80  70  70  85  80  75  70  ...

是否存在一些 R 函数,允许合并数据框中的两行,同时保留属于其中任一行的所有值以防发生冲突?

提前感谢您的帮助!

【问题讨论】:

    标签: r merge dataframe rows


    【解决方案1】:

    这是一个使用“动物园”中的na.locf 的想法:

    library(zoo)
    na.locf(mydf)[grep("Series2", mydf$Series), ]
    #   Country  Series T1 T2 T3 T4 T5 T6 T7 T8
    # 2   Japan Series2 10 20 10 35 40 30 30 20
    # 4   Korea Series2 70 80 70 70 85 80 75 70
    

    【讨论】:

    • 打赌这运行得更快:-)。我真的需要在工作中更多地使用zoo
    • 我不知道zoo 能做到这一点!非常感谢你做的这些。不过,我决定在我目前的项目中使用 Carl 的方法,因为速度不如不言自明的代码重要 :)
    【解决方案2】:

    当两个系列不同时,您似乎总是希望删除 NA - 对吗?

    如果是这样,这里有一个简单的方法。

    newseries<- series2
    newseries[is.na(newseries)]<-series1[is.na(newseries)]
    

    我特意创建了newseries,以免修改您的输入向量。请注意,这始终选择 series2 值,除非该值为 NA 。如果您发现需要一种更复杂的方法来选择 series2 值而不是 series1 值,则需要做更多的工作。

    编辑:正如 Ananda 指出的那样,您需要将这些行包装在一个循环中,依次选择每个国家/地区名称并提取所需的行。

    【讨论】:

    • +1。我使用了a similar approach,但使用了来自动物园的na.locf,但这并没有真正说明如何将其扩展到“国家”中的所有值。
    • 非常感谢!这非常有效。我决定采用这种方法,因为它不需要单独的包并且非常直观。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 2013-10-27
    • 2018-08-04
    • 1970-01-01
    • 2017-05-10
    相关资源
    最近更新 更多