重复行的R-dplyr映射切片

重复行的R-dplyr映射切片,r,split,dplyr,R,Split,Dplyr,我很难把切片和地图结合起来 我对做类似的事情感兴趣;在我的例子中,就是将一个紧凑的person-period文件转换为一个长的连续person-period文件。但是,由于我的文件太大,我需要先拆分数据 我的数据是这样的 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

我很难把切片和地图结合起来

我对做类似的事情感兴趣;在我的例子中,就是将一个紧凑的person-period文件转换为一个长的连续person-period文件。但是,由于我的文件太大,我需要先拆分数据

我的数据是这样的

    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
我所需要的只是这个答案

不过,我有兴趣介绍一个拆分的。$组

我该怎么做呢

dt %>% split(.$group) %>% map_df(slice(rep(1:n(),.$dur)))
例如,它不起作用

我所需的输出与dt%>%slicerep1: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
.....
但我需要拆分此操作,因为文件太大

资料

map有两个参数:一个是.x中的向量/列表,另一个是.f中的函数。然后将.f应用于.x中的所有元素

传递给映射的函数格式不正确。试试这个:

f <- function(x) x %>% slice(rep(1:n(), .$dur))
dt %>% 
  split(.$group) %>% 
  map_df(f)
这一次,您直接将slice函数传递给带有附加参数的map。

map接受两个参数:在.x中的vector/list和在.f中的函数。然后将.f应用于.x中的所有元素

传递给映射的函数格式不正确。试试这个:

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

这一次,您可以直接传递slice函数来映射其他参数。

我不太确定您想要的最终输出是什么,但是您可以使用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的回答给出了与您最初的方法完全相同的输出-这就是您想要的吗?我不知道它是否比您原来的方法有任何优势。

我不太确定您想要的最终输出是什么,但是您可以使用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的回答给出了与您最初的方法完全相同的输出-这就是您想要的吗?我不知道它是否比您原来的方法有任何优势。

我不清楚OP期望的输出是什么,尽管我还没有投票表决it@hrbrmstr我认为这与链接帖子中的内容是一样的,我不清楚OP的预期输出是什么,尽管我还没有投票it@hrbrmstr我认为这与链接中的相同邮递
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()