R 重新组合数据集

R 重新组合数据集,r,dplyr,tidyr,R,Dplyr,Tidyr,使用以下数据集: id from to trip 1 1 A B <NA> 2 1 B C X 3 1 C D <NA> 4 1 D A X 5 2 B A X 6 2 A C <NA> 7 2 C D <NA> id从到跳闸 1 A B 2 1 B C X 3 1 C D 4 1 D A X 5 2 B A X 6 2 A C 7 2 C D 每当我在

使用以下数据集:

  id from to trip
1  1    A  B <NA>
2  1    B  C    X
3  1    C  D <NA>
4  1    D  A    X
5  2    B  A    X
6  2    A  C <NA>
7  2    C  D <NA>
id从到跳闸
1 A B
2 1 B C X
3 1 C D
4 1 D A X
5 2 B A X
6 2 A C
7 2 C D
每当我在trip列上达到一个X时,我都会尝试分割数据,以获得类似这样的结果(请注意,有一个新列):

id从到行程组
1 A B 1
21BCx1
3 1 C D 2
4 1 D A X 2
5B2A3
6 2 A C 4
7 2 C D 4
这意味着它将遍历观测值/行,并基于id和trip列,在每次到达X时启动一个新的数字

我已经尝试了几件关于
groupby(df,id,trip)
的事情,但是我总是没有类似的结构


有什么建议吗?

此基本R方法适用于以下示例:

df$group <- c(1, head(cumsum(df$trip == "X") + 1, -1))
df$group试试这个(如果你真的需要在X之后在第行开始新的组,我想你可以通过另一个shift()在行程中==“X”:

库(data.table)
种子(1)

na.zero取决于您有多少行,您始终可以创建一个新变量,该变量在每次出现x时自动递增。原始解决方案,但易于实现。
mutate(df,cumsum(!is.na(trip))
?或只
group_by(df,cumsum(!is.na(trip)))
@Lowpar,在这个例子中,它很简单,但在现实生活中,我有9.000.000个观察值,这使得采用基本方法更加复杂。您提到的是使用if函数吗?@FilipeTeixeira Add
lag
。如果trip存储为
NA
,而不是
cumsum
将返回的文本,则这不起作用rn
NA
。稍微修改一下就可以解决这个问题:
df$group实际上这解决了我的另一个问题,当我没有NA时,我有了因子。
df$group <- c(1, head(cumsum(df$trip == "X") + 1, -1))
df
  id from to trip group
1  1    A  B <NA>     1
2  1    B  C    X     1
3  1    C  D <NA>     2
4  1    D  A    X     2
5  2    B  A    X     3
6  2    A  C <NA>     4
7  2    C  D <NA>     4
library(data.table)
set.seed(1)

na.zero <- function (x) {
  x[is.na(x)] <- 0
  return(x)
}

dt <- data.table(id = c(1,1,1,2,2,2),
                 from = sample(c("A", "B", "C", "D"), 6, replace = T),
                 to = sample(c("A", "B", "C", "D"), 6, replace = T),
                 trip = sample(c("X", NA), 6, replace = T))

dt[, group:=(cumsum(na.zero(trip=="X"))+cumsum(id-na.zero(shift(id, 1L,type = 'lag'))))]

   id from to trip group
1:  1    B  D   NA     1
2:  1    B  C    X     2
3:  1    C  C   NA     2
4:  2    D  A    X     4
5:  2    A  A   NA     4
6:  2    D  A   NA     4