【问题标题】:Updating column based on previous row values根据前一行值更新列
【发布时间】:2016-06-30 14:36:39
【问题描述】:

我有这个数据框 df1。

    User|Date|Index|
    a   |1   |1    |
    a   |1   |2    |
    a   |1   |3    |
    a   |1   |0    |
    a   |1   |5    |
    a   |1   |6    |
    a   |2   |0    |
    b   |4   |1    |
    b   |4   |2    |
    b   |4   |3    |

我想通过以下方式更新索引列:

  1. 按用户、日期对数据进行分组;
  2. 假设行的顺序正确;
  3. 遍历列Index,当找到0值时,将其更新为1,并更正以下几行,在上一行的基础上增加1,直到找到另一个0。

我已将范围缩小到此,但我不确定如何完成替换部分以完成我想要的操作。

    df1 %>%
    group_by(User, Date) %>%
    mutate(Index = replace(Index,)

谁能帮帮我?


编辑: 上面的数据框是一个简化。这是代码。

    df1 <-structure(list(User = c(2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,3), 
    Date = c(16864, 16864, 16864, 16864, 16864, 16879, 16879,16879, 16879, 16879, 16879, 16879, 16879, 16879), 
    Index = c(16,17, 0, 19, 20, 1, 2, 3, 0, 5, 0, 0, 8, 9)), 
    class = "data.frame", .Names = c("User","Date", "Index"), row.names = c(NA, -14L))

这是目前的样子:

    User|Date    |Index|
    2   |16864   |16   |
    2   |16864   |17   |
    2   |16864   |0    |
    2   |16864   |19   |
    2   |16864   |20   |
    3   |16879   |1    |
    3   |16879   |2    |
    3   |16879   |3    |
    3   |16879   |0    |
    3   |16879   |5    |
    3   |16879   |0    |
    3   |16879   |0    |
    3   |16879   |8    |
    3   |16879   |9    |

想要的输出是:

    User|Date    |Index|
    2   |16864   |16   |
    2   |16864   |17   |
    2   |16864   |1    |
    2   |16864   |2    |
    2   |16864   |3    |
    3   |16879   |1    |
    3   |16879   |2    |
    3   |16879   |3    |
    3   |16879   |1    |
    3   |16879   |2    |
    3   |16879   |1    |
    3   |16879   |1    |
    3   |16879   |2    |
    3   |16879   |3    |

【问题讨论】:

  • 你能显示预期的输出吗?也请有一个look at this link 并修改
  • 是否有理由不简单地将零替换为 1 作为第一步?如果您要替换所有这些,我不明白为什么需要迭代地完成。
  • 0 没有特殊原因。我想它可能已经从 1 开始了。
  • 已编辑。感谢您提供关于可重现 R 代码 @Sotos 的链接

标签: r dplyr


【解决方案1】:

可能有更聪明的方法来实现这一点,但这是我对自定义函数的尝试

myfun <- function(x)  { 
  indx <- which(x == 0L)
  c(x[1L:(indx[1L] - 1L)], sequence(c(diff(indx), length(x) - last(indx) + 1L)))
}

df1 %>%
  group_by(User, Date) %>%
  mutate(Index = myfun(Index))

# Source: local data frame [14 x 3]
# Groups: User, Date [2]
#     User  Date Index
#    (dbl) (dbl) (dbl)
# 1      2 16864    16
# 2      2 16864    17
# 3      2 16864     1
# 4      2 16864     2
# 5      2 16864     3
# 6      3 16879     1
# 7      3 16879     2
# 8      3 16879     3
# 9      3 16879     1
# 10     3 16879     2
# 11     3 16879     1
# 12     3 16879     1
# 13     3 16879     2
# 14     3 16879     3

【讨论】:

  • 当我将此函数应用于类似的数据框时,它会返回大小不兼容的错误。知道为什么会这样吗?我试图使用调试,但我无法弄清楚为什么。你有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 2016-06-24
  • 1970-01-01
  • 2021-11-12
  • 2019-07-06
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多