【问题标题】:R - dplyr map slice for repeat rowsR - 用于重复行的 dplyr 映射切片
【发布时间】:2016-08-12 10:29:38
【问题描述】:

我在组合 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")

【问题讨论】:

  • 我不清楚 OP 期望的输出是什么(尽管我根本没有投票)
  • @hrbrmstr 我认为它与链接帖子中的相同

标签: r split dplyr


【解决方案1】:

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 并附加参数。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-19
      • 2015-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-17
      相关资源
      最近更新 更多