2016-08-12 120 views
1

我无法合并slicemap重复行的R - dplyr映射片

我有兴趣做类似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

不知道为什么它被downvoted,这看起来像一个有趣的问题(加一) – akrun

+0

我不清楚OP作为输出期望什么(虽然我还没有投票) – hrbrmstr

+0

@hrbrmstr我认为它与链接文章中的相同 – akrun

回答

3

map采用两个参数:在.x矢量/列表和.f一个功能。然后对.x中的所有元素应用.f

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

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

您也可以使用这样的:

这个时候你直接通过slice功能map与其他参数。

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的答案给出了与原始方法完全相同的输出 - 是你在找什么?我不知道它是否会比原来的方法有什么优势。