我正在处理列表列。一列是感兴趣的数据,另一列是数据的行索引列表。我想动态地将新列添加到列表列并为其添加标题。每个新列都应该是存储在另一列中的索引切片的数据的子集。我能够创建一个新的列表列,但如果我尝试索引一个映射变量,它就不起作用。下面的例子重现了我到目前为止所做的。
library(tidyverse)
# This sample mimics the structure of my data
LC <- mtcars %>%
as_tibble() %>%
group_by(gear) %>%
nest() %>%
rowwise() %>%
mutate(inds = list(as.integer(ceiling(runif(n = gear))))) %>%
group_by(gear) %>%
print()
如果我想改变 1 个新列,则以下映射函数有效
LC.slice <- LC %>%
mutate(slices = map2(.x = data,
.y = inds,
~ .x %>%
slice((.y[[1]] - 1): (.y[[1]] + 1)))) %>%
print()
但我的目标是动态创建和命名许多列。所以我尝试了这样的功能:
LC.slicer <- function(df, var1, var2){
for (i in 1:3){
df <- df %>%
mutate("slice_{i}" := map2(.x = {{ var1 }},
.y = {{ var2 }},
~ .x %>%
slice((.y[[i]] - 1): (.y[[i]] + 1))))
}
}
# and then call the function
LC.sliced <- LC.slicer(LC, data, inds) %>% print()
但是这个函数返回 NULL。
我怎样才能成功地建立一个函数的索引?
只需在for循环后返回对象
LC.slicer <- function(df, var1, var2){
for (i in 1:3){
df <- df %>%
mutate("slice_{i}" := map2(.x = {{ var1 }},
.y = {{ var2 }},
~ .x %>%
slice((.y[[i]] - 1): (.y[[i]] + 1))))
}
df
}
-测试
> LC.slicer(LC, data, inds)
# A tibble: 3 × 6
# Groups: gear [3]
gear data inds slice_1 slice_2 slice_3
<dbl> <list> <list> <list> <list> <list>
1 4 <tibble [12 × 10]> <int [4]> <tibble [2 × 10]> <tibble [2 × 10]> <tibble [2 × 10]>
2 3 <tibble [15 × 10]> <int [3]> <tibble [2 × 10]> <tibble [2 × 10]> <tibble [2 × 10]>
3 5 <tibble [5 × 10]> <int [5]> <tibble [2 × 10]> <tibble [2 × 10]> <tibble [2 × 10]>