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 Addlag
。如果trip存储为NA
,而不是cumsum
将返回的文本,则这不起作用rnNA
。稍微修改一下就可以解决这个问题: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