【问题标题】:comparing previous and next rows and setting a condition比较上一行和下一行并设置条件
【发布时间】:2018-03-19 19:53:40
【问题描述】:

我想比较给定行的上一行和下一行。我为此目的使用了diff 函数,但不幸的是它没有提供我需要的东西。类似的帖子是here,但我的帖子是在寻找不同的东西!

这就是我的意思

test = data.frame(y1=c(10,22,22,36,36,36,38),
                      y2=c(12,22,18,21,14,17,15))  

> test
  y1 y2
1 10 12
2 22 22
3 22 18
4 36 21
5 36 14
6 36 17
7 38 15

我试过了

test%>%
mutate(diff_y1=c(NA,diff(y1)))

  y1 y2 diff_y1
1 10 12      NA
2 22 22      12
3 22 18       0
4 36 21      14
5 36 14       0
6 36 17       0
7 38 15       2

我想要的是,如果该行的前一行有连续行,则分配相同的差异编号。看到diff 函数给出了不同的diff_y1 值。这是正常的。我要补充的是,如果第一行开始连续行,则设置相同的差异值。

如果第 i 行和 i+1 或 i 和 i-1 相同,我希望第 i 和 i+1 行或 i 和 i-1 上的值为 0。

这样的结果是预期的输出

      y1 y2 diff_y1
    1 10 12      NA
    2 22 22       0
    3 22 18       0
    4 36 21       0
    5 36 14       0
    6 36 17       0
    7 38 15       2

【问题讨论】:

  • 你的说法不清楚。
  • @Onyambu 我稍微编辑了 OP。你能告诉我哪一部分不清楚吗?
  • 我不明白你的分配程序。为什么你有一堆零然后是 2?您使用什么逻辑在第 4 行分配 0 或在第 2 行分配 0?
  • diff 函数从当前值中减去前一个值。我确实理解这一点,它给出了您声称的错误输出。那么你使用什么逻辑来获得预期的输出呢?
  • @Onyambu 好的。看到diff 函数给出了不同的diff_y1 值。这是正常的。我要补充的是,如果第一行开始连续行,则设置相同的差异值。像 22 22 它们是连续的,所以我希望它们具有相同的 diff_y1 值,但可能使用另一个函数?

标签: r


【解决方案1】:

只是为了提供替代方案,您可以使用梦幻般的dplyr 包,尤其是case_when()lead()lag()

library(dplyr)
test = data.frame(y1=c(10,22,22,36,36,36,38),
                  y2=c(12,22,18,21,14,17,15))
test %>%
  mutate(prev_ = lag(y1),                 # the previous item
         next_ = lead(y1),                # the next item
         diff_y1 = case_when(             # ifelse 
           y1 == next_ | y1 == prev_ ~ 0,
           TRUE ~ y1-prev_
         )) %>%
  select(-prev_,-next_)                   # deselect prev & next

产量

  y1 y2 diff_y1
1 10 12      NA
2 22 22       0
3 22 18       0
4 36 21       0
5 36 14       0
6 36 17       0
7 38 15       2

【讨论】:

  • 感谢 Jan。很高兴能以另一种方式查看数据。
【解决方案2】:

如果第 i 行和 i+1 行相同,您希望第 i 行和 i+1 行上的值为 0。

我们首先应用 diff r 函数。 每当第 i 行的差异为 0 时,这意味着第 i-1 行的“差异”也应设置为 0。

customdiff <- function(x){
  res<-c(NA,diff(x))
  res[which(res==0)-1]=0
  res
}

test%>%
  mutate(diff_y1=customdiff(y1))

【讨论】:

  • 非常感谢你!你救了我的一天!非常感谢!只有一件事我怎样才能学会像你一样编写函数?
  • 练习.. 我认为没有捷径或教程可以让你到达那里。我花了几个月的时间调试和改进我自己的代码。你最终会到达那里。 =) 请记住,您遇到的每个问题都会一次又一次地出现。我唯一的建议是尽可能严格地解决每一个编码问题,无论问题有多重要。它支付得非常快。另外,StackOverflow 的大力支持,你很幸运能早早来到这里!
猜你喜欢
  • 2014-05-15
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多