【问题标题】:Change column value based in previous row根据上一行更改列值
【发布时间】:2019-01-18 10:37:16
【问题描述】:

我有一张这样的桌子:

| Group | Id | value |  
| :---- | :- | :---- |  
| A | a | 0 |  
| A | b | 1 |  
| A | c | 2 |  
| A | d | 0 |  
| A | e | 1 |  
| B | f | 0 |  
| B | g | 1 |  
| B | h | 2 |  
| B | i | 0 |  
| B | j | 1 |  

我想添加一个列,其值基于同一组下的先前行和当前行之间的比较。
该列从值 1 开始,如果前一个值大于当前值,则该列将递增,并且这可能发生在同一组内。

| Group | Id | value | iteration |  
| :---- | :- | :---- | :-------- |  
| A | a | 0 | 1 |  
| A | b | 1 | 1 |   
| A | c | 2 | 1 |  
| A | d | 0 | 2 |  
| A | e | 1 | 2 |  
| B | f | 0 | 1 |  
| B | g | 1 | 1 |  
| B | h | 2 | 1 |  
| B | i | 0 | 2 |  
| B | j | 1 | 2 |  

我试过这个:

df[ , iteration := if (value < shift(value)) shift(iteration) + 1 else shift(iteration), by = Group]

但它返回错误:

if (value 1 并且只有第一个 元素将被使用”

if (value

提前致谢

【问题讨论】:

  • if (...) 仅适用于长度为一的条件。一个data.table翻译user3640617的答案是setDT(df)[, iter := rleid(cumsum(shift(value, fill = 0) &gt; value)), by=Group]

标签: r dataframe data.table compare


【解决方案1】:

dplyr 解决方案:

library(dplyr)

df <- data.frame(Group=rep(c("A","B"), each=5), 
           ID=letters[1:10], value=c(0,1,2,0,1,0,1,2,0,1))

df %>% group_by(Group) %>% 
       mutate(Iteration = cumsum(ifelse(value >= lag(value, default=Inf), 0, 1)))

编辑:之前我写过“default = 1”,但只有在每个组中的值以 0 开头时才有效。我用 Inf 替换了它,这样即使第一个值不是 0 也有效。 EDIT2:现在,当后续两行中的值相同时,它可以正常工作。

【讨论】:

  • 不要按我的意愿工作如果数据集是 > df
  • 是的,你是对的。我修改了我的答案(应该是 value &gt;= 而不是 value &gt;
【解决方案2】:
 df%>%
    group_by(Group)%>%
    mutate(new = cumsum(c(1, diff(value)) < 0) + 1)
# A tibble: 10 x 4
# Groups:   Group [2]
   Group ID    value   new
   <fct> <fct> <dbl> <dbl>
 1 A     a         0     1
 2 A     b         1     1
 3 A     c         2     1
 4 A     d         0     2
 5 A     e         1     2
 6 B     f         0     1
 7 B     g         1     1
 8 B     h         2     1
 9 B     i         0     2
10 B     j         1     2

【讨论】:

    猜你喜欢
    • 2021-09-05
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2021-10-10
    • 2022-07-04
    • 2012-12-22
    • 1970-01-01
    相关资源
    最近更新 更多