我有一个相当大的数据集,其格式如下表所示:
value ID
1 0 A
2 0 A
3 1 A
4 1 A
5 0 A
6 -1 A
7 0 B
8 1 B
9 1 B
10 0 B
11 0 B
12 0 B
13 1 C
14 1 C
15 0 C
16 1 C
17 1 C
18 1 C
19 0 C
基本上我想转换上面的内容,只保留序列的第一个和最后一个值,它们以零的出现开头,后跟未知数量的1,并在最后一次出现时结束:
value ID
2 0 A
4 1 A
7 0 B
9 1 B
15 0 C
18 1 C
有没有简单的方法来实现这一目标? 第一个例子的输入如下:
structure(list(value = structure(c(2L, 2L, 3L, 3L, 2L, 1L, 2L,
3L, 3L, 2L, 2L, 2L, 3L, 3L, 2L, 3L, 3L, 3L, 2L), .Label = c("-1",
"0", "1"), class = "factor"), ID = structure(c(1L, 1L, 1L, 1L,
1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("A", "B", "C"), class = "factor")), .Names = c("value", "ID"), row.names = c(NA, -19L), class = "data.frame")
答案 0 :(得分:3)
我尝试使用<groupId>
和data.table
套餐组合
stringi
这基本上将每个组转换为单个字符串,然后在从行索引library(stringi)
library(data.table)
setDT(df)[, .(.I[stri_locate_all_regex(paste(value, collapse = ""), "01+")[[1]]], 0:1), by = ID]
# ID V1 V2
# 1: A 2 0
# 2: A 4 1
# 3: B 7 0
# 4: B 9 1
# 5: C 15 0
# 6: C 18 1
进行子集化时检测与01+
正则表达式匹配的部分的开头和结尾。最后,我只是将.I
添加到数据中(至少对我来说这似乎是多余的)。