我正在尝试使用dplyr
将列value
的运行长度插入到每个group
的数据中。
tdf <- tbl_df(structure(list(group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("A",
"B"), class = "factor"), value = c(TRUE, TRUE, TRUE, TRUE, TRUE,
TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE,
FALSE, TRUE, TRUE, FALSE, FALSE, FALSE)), class = c("tbl_df",
"tbl", "data.frame"), .Names = c("group", "value"), row.names = c(NA,
-20L)))
我的数据看起来像这样......
> tdf
Source: local data frame [20 x 2]
group value
1 A TRUE
2 A TRUE
3 A TRUE
4 A TRUE
5 A TRUE
6 A TRUE
7 A FALSE
8 A FALSE
9 A TRUE
10 A FALSE
11 B FALSE
12 B FALSE
13 B FALSE
14 B FALSE
15 B FALSE
16 B TRUE
17 B TRUE
18 B FALSE
19 B FALSE
20 B FALSE
我想要的输出看起来像这样......(注意组之间的运行长度重新开始)
group value run_length
1 A TRUE 6
2 A TRUE 6
3 A TRUE 6
4 A TRUE 6
5 A TRUE 6
6 A TRUE 6
7 A FALSE 2
8 A FALSE 2
9 A TRUE 1
10 A FALSE 1
11 B FALSE 5
12 B FALSE 5
13 B FALSE 5
14 B FALSE 5
15 B FALSE 5
16 B TRUE 2
17 B TRUE 2
18 B FALSE 3
19 B FALSE 3
20 B FALSE 3
我认为这只是在dplyr中这样做的事情......
group_by(tdf, group) %.%
mutate(run_len = rep(rle(value)$lengths,rle(value)$lengths))
但我收到错误:
Error in rle(value) : object 'value' not found
我在dplyr之外使用split和lapply有一个解决方案,但是想知道这在dplyr中是如何工作的。
答案 0 :(得分:5)
tbl_dt()
似乎就是您所需要的。 tdf
的按预期工作:
tbl_dt(tdf) %>%
group_by(group) %>%
mutate( run_len = rep( rle(value)$lengths,rle(value)$lengths ) )
等效的tbl_df()
不起作用......我不知道为什么......
tbl_df(tdf) %>%
group_by(group) %>%
mutate( run_len = rep( rle(value)$lengths,rle(value)$lengths ) )
给出了熟悉的错误:Error in rle(value) : object 'value' not found