我觉得自己错过了一些事情,但是找不到答案。我试图定义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
答案 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))