dplyr错误:在mutate()中使用rle()找不到对象

时间:2014-05-23 03:25:18

标签: r dplyr

我正在尝试使用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中是如何工作的。

1 个答案:

答案 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