“棘轮”功能:仅当明年的结果更大时才替换上一年的结果[重复]

Posted

技术标签:

【中文标题】“棘轮”功能:仅当明年的结果更大时才替换上一年的结果[重复]【英文标题】:"ratchet" function: replace previous year's results only if next year's results are greater [duplicate] 【发布时间】:2018-11-06 14:12:54 【问题描述】:

只有在下一年的percentpp 更大时,我才需要遍历 df 中的年份并替换另一列 (percentpp) 中的值。一旦一个单元格达到一个高值,它就无法返回 - 只能向上,就像棘轮一样。

例如,我有什么:

  cell_id   year    percentpp
1   40      2011    3
2   41      2011    1
3   42      2011    0
4   43      2011    0
5   40      2012    1
6   41      2012    5
7   42      2012    1   
8   43      2012    5
9   40      2013    2
10  41      2013    2
11  42      2013    2
12  43      2013    0
13  40      2014    2   
14  41      2014    3   
15  42      2014    3   
16  43      2014    3   

以及我希望它变成的样子:

  cell_id   year    percentpp
1   40      2011    3
2   41      2011    1
3   42      2011    0
4   43      2011    0
5   40      2012    3
6   41      2012    5
7   42      2012    1   
8   43      2012    5
9   40      2013    3
10  41      2013    5
11  42      2013    2   
12  43      2013    5    
13  40      2014    3   
14  41      2014    5   
15  42      2014    3   
16  43      2014    5   

我正在想象一个具有这种伪 R/SQL 逻辑的函数,然后使用 lapply 循环遍历:

function(x) 
  if df$percentpp[year+1,] is greater than df$percentpp[year,]
  when cell_id$year = cell_id$year+1
  then df$percentpp[year,] <- df$percentpp[year+1,]

但我不确定如何正确执行此操作。

【问题讨论】:

【参考方案1】:

您可以使用cummax

使用基础 R:

df <- df[order(df$year), ]
df$percentpp <- ave(df$percentpp, df$cell_id, FUN = cummax)

使用 dplyr:

library(dplyr)

df <- df %>%
  group_by(cell_id) %>%
  arrange(year) %>%
  mutate(percentpp = cummax(percentpp)) %>%
  ungroup

数据:

df <- read.table(text = "
  cell_id   year    percentpp
1   40      2011    3
2   41      2011    1
3   42      2011    0
4   43      2011    0
5   40      2012    1
6   41      2012    5
7   42      2012    1   
8   43      2012    5
9   40      2013    2
10  41      2013    2
11  42      2013    2
12  43      2013    0
13  40      2014    2   
14  41      2014    3   
15  42      2014    3   
16  43      2014    3 
")

【讨论】:

以上是关于“棘轮”功能:仅当明年的结果更大时才替换上一年的结果[重复]的主要内容,如果未能解决你的问题,请参考以下文章

仅当字符串包含匹配项时才替换字符串周围的标签

Javascript:仅当它是文本的第一个单词时才替换“x”,而不是其他任何地方

仅当尚未设置时才设置原子

JPA:仅当结果集不为空时才缓存查询

Ajax PHP - 仅当 DOM Explorer 打开(边缘)时才会回显结果

当且仅当文本框具有焦点并且按下“输入”时才实现插槽功能?