如果满足条件,则对行进行计数

时间:2020-05-12 20:56:53

标签: r

我觉得自己错过了一些事情,但是找不到答案。我试图定义group_id,条件匹配时组从哪里开始。在这种情况下,条件为valuex不等于valuey。使用SQL中的窗口函数可以轻松实现这一点,但是我不知道在R中做什么

这是输入值。

Name|valuex|valuey
A   |     X|     X
A   |     X|     X
A   |     X|     X
A   |     X|     Z
A   |     Z|     Z
A   |     Z|     Z
A   |     Z|     Z
A   |     Z|     Y

预期产量

Name|valuex|valuey|group
A   |     X|     X|0
A   |     X|     X|0
A   |     X|     X|0
A   |     X|     Z|1
A   |     Z|     Z|1
A   |     Z|     Z|1
A   |     Z|     Z|1
A   |     Z|     Y|2

3 个答案:

答案 0 :(得分:5)

基本R:

dat$group <- cumsum(dat$valuex != dat$valuey)
dat
#   Name valuex valuey group
# 1    A      X      X     0
# 2    A      X      X     0
# 3    A      X      X     0
# 4    A      X      Z     1
# 5    A      Z      Z     1
# 6    A      Z      Z     1
# 7    A      Z      Z     1
# 8    A      Z      Y     2

数据:

dat <- structure(list(Name = c("A", "A", "A", "A", "A", "A", "A", "A"
), valuex = c("X", "X", "X", "X", "Z", "Z", "Z", "Z"), valuey = c("X", 
"X", "X", "Z", "Z", "Z", "Z", "Y")), class = "data.frame", row.names = c(NA, 
-8L))

答案 1 :(得分:2)

这是另一种使用findInterval的基本R解决方案,例如

dfout <- within(df,group <- findInterval(seq(nrow(df)),which(valuex!=valuey)))

给出

> dfout
  Name valuex valuey group
1    A      X      X     0
2    A      X      X     0
3    A      X      X     0
4    A      X      Z     1
5    A      Z      Z     1
6    A      Z      Z     1
7    A      Z      Z     1
8    A      Z      Y     2

数据

df <- structure(list(Name = c("A", "A", "A", "A", "A", "A", "A", "A"
), valuex = c("X", "X", "X", "X", "Z", "Z", "Z", "Z"), valuey = c("X", 
"X", "X", "Z", "Z", "Z", "Z", "Y")), class = "data.frame", row.names = c(NA,
-8L))

答案 2 :(得分:2)

带有dplyr

的选项
library(dplyr)
dat %>%
     group_by(Name) %>%
     mutate(group = cumsum(valuex != valuey))
# A tibble: 8 x 4
# Groups:   Name [1]
#  Name  valuex valuey group
#  <chr> <chr>  <chr>  <int>
#1 A     X      X          0
#2 A     X      X          0
#3 A     X      X          0
#4 A     X      Z          1
#5 A     Z      Z          1
#6 A     Z      Z          1
#7 A     Z      Z          1
#8 A     Z      Y          2

数据

dat <- structure(list(Name = c("A", "A", "A", "A", "A", "A", "A", "A"
), valuex = c("X", "X", "X", "X", "Z", "Z", "Z", "Z"), valuey = c("X", 
"X", "X", "Z", "Z", "Z", "Z", "Y")), class = "data.frame", row.names = c(NA, 
-8L))