r - 根据上一行更改列值

标签 r dataframe data.table compare

我有一个这样的表:

| 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]

但它返回错误:

Warning message in if (value < shift(value)) shift(iteration) + 1 else shift(iteration): “the condition has length > 1 and only the first element will be used”

Error in if (value < shift(value)) shift(iteration) + 1 else shift(iteration): missing value where TRUE/FALSE needed

提前致谢

最佳答案

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:现在,当后续两行中的值相同时,它可以正常工作。

关于r - 根据上一行更改列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51792829/

相关文章:

r - 使用过滤器查找每组的唯一值

r - R : How to to get yaxis labels to use ticktext value instead of range value? 中带有 facet_grid 的 Plotly 和 ggplot

r - 拆分后的数据框列名称

python - 如何获取 pandas 数据框中单词列表(子字符串)的出现次数?

python - pandas 通过排除日期范围对 DatetimeIndex 进行过滤

python - 设置索引,使用常见的列值作为数据框的索引

R Markdown : add header under tabset

r - R中矩阵的反向索引

r - 从 data.table 列中修剪空白

r - 使用先前计算值(滚动)时最有效/矢量化