我无法合并slice
和map
。
我有兴趣做一些与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")
答案 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的答案提供的输出与您原来的方法完全相同 - 您所寻找的是什么?我不知道它是否比原来的方法有任何优势。