R - dplyr重复行的地图切片

时间:2016-08-12 10:29:39

标签: r split dplyr

我无法合并slicemap

我有兴趣做一些与this类似的事情;在我的例子中,这是将一个紧凑的人 - 周期文件转换为一个长的(顺序的)人 - 周期文件。但是,因为我的文件太大,我需要先拆分数据。

我的数据看起来像这样

    group id var ep dur
1      A  1   a  1  20
2      A  1   b  2  10
3      A  1   a  3   5
4      A  2   b  1   5
5      A  2   b  2  10
6      A  2   b  3  15
7      B  1   a  1  20
8      B  1   a  2  10
9      B  1   a  3  10
10     B  2   c  1  20
11     B  2   c  2   5
12     B  2   c  3  10

我需要的只是这个(来自this的答案)

library(dplyr)
dt %>% slice(rep(1:n(),.$dur))

但是,我有兴趣介绍split(.$group)

我怎么想这样做?

dt %>% split(.$group) %>% map_df(slice(rep(1:n(),.$dur)))

不工作例如。

我想要的输出与dt %>% slice(rep(1:n(),.$dur))相同

     group id var ep dur
1       A  1   a  1  20
2       A  1   a  1  20
3       A  1   a  1  20
4       A  1   a  1  20
5       A  1   a  1  20
6       A  1   a  1  20
7       A  1   a  1  20
8       A  1   a  1  20
9       A  1   a  1  20
10      A  1   a  1  20
.....

但是我需要split这个操作因为文件太大了。

数据

dt = structure(list(group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L), .Label = c("A", "B"), class = "factor"), 
id = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 
2L, 2L), .Label = c("1", "2"), class = "factor"), var = structure(c(1L, 
2L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 3L, 3L, 3L), .Label = c("a", 
"b", "c"), class = "factor"), ep = structure(c(1L, 2L, 3L, 
1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label = c("1", "2", 
"3"), class = "factor"), dur = c(20, 10, 5, 5, 10, 15, 20, 
10, 10, 20, 5, 10)), .Names = c("group", "id", "var", "ep", 
"dur"), row.names = c(NA, -12L), class = "data.frame")

2 个答案:

答案 0 :(得分:3)

map有两个参数:.x中的向量/列表和.f中的函数。然后,它会对.f中的所有元素应用.x

您传递给map的功能格式不正确。试试这个:

f <- function(x) x %>% slice(rep(1:n(), .$dur))
dt %>% 
  split(.$group) %>% 
  map_df(f)

您也可以像这样使用它:

dt %>% 
  split(.$group) %>% 
  map_df(slice, rep(1:n(), dur))

这一次,您可以使用其他参数直接将slice函数传递给map

答案 1 :(得分:1)

我不太确定你想要的最终输出是什么,但是你可以使用tidyr来嵌套你想要重复的数据,并使用一个简单的函数来扩展嵌套数据的级别,非常相似对Tutuchan的回答。

expand_df <- function(df, repeats) {
  df %>% slice(rep(1:n(), repeats))
}

dt %>% 
    tidyr::nest(var:ep) %>% 
    mutate(expanded = purrr::map2(data, dur, expand_df)) %>% 
    select(-data) %>% 
    tidyr::unnest()

Tutuchan的答案提供的输出与您原来的方法完全相同 - 您所寻找的是什么?我不知道它是否比原来的方法有任何优势。