【问题标题】:How to update row values based on other row values in R?如何根据 R 中的其他行值更新行值?
【发布时间】:2017-06-21 09:21:20
【问题描述】:

我有一个具有以下值的数据框:

Id CreationDate 值 ChangeCounter 1 日期1 p01 1 2 日期 2 p01 1 3 日期3 p02 2 4 日期4 p02 2 5 日期 5 p01 3 6 日期6 p03 4

这里的“ChangeCounter”是需要添加到数据框中的新列。更改计数器中的值,它基本上跟踪值列更改的次数。

最终,每当值字段发生更改时,我都会尝试获取第一行的列表。因此输出将是:

输出:

Id CreationDate 值 ChangeCounter 1 日期1 p01 1 3 日期3 p02 2 5 日期 5 p01 3 6 日期6 p03 4

我阅读的大多数示例都对列进行操作,进行转换并为行添加新的列值。但是我的要求的例子让我望而却步。如果有任何其他更好的方法可以在不计算“ChangeCounter”列的情况下实现最终结果,也会给出解决问题的不同观点。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    没有找零计数器:

    GoodRows = c(1,which(df$Value[-1] != df$Value[-nrow(df)]) +1)
    df[GoodRows,]
      Id CreationDate Value
    1  1        date1   p01
    3  3        date3   p02
    5  5        date5   p01
    6  6        date6   p03
    

    【讨论】:

    • 谢谢@G5W,df$Value[-1] 查看上一行?
    • df$Value[-1] 删除第一行。 df$Value[-nrow(df)] 删除最后一行。因此,当您在 GoodRows 中计算 != 时,您正在检查一行何时不等于前一行。
    【解决方案2】:

    如果您想知道Value 发生更改的行,那么这可能会有所帮助:

    df[c(TRUE, head(df$Value, n = -1) != tail(df$Value, n = -1)), ]
    

    如果您想要确切的 ChangeCounter 列,那么:

    df$ChangeCounter <- cumsum(c(TRUE, head(df$Value, n = -1) !=
                                         tail(df$Value, n = -1)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      • 1970-01-01
      • 2020-07-03
      • 1970-01-01
      相关资源
      最近更新 更多