如何在 for 循环中索引 purrr 映射调用

问题描述 投票:0回答:1

我正在处理列表列。一列是感兴趣的数据,另一列是数据的行索引列表。我想动态地将新列添加到列表列并为其添加标题。每个新列都应该是存储在另一列中的索引切片的数据的子集。我能够创建一个新的列表列,但如果我尝试索引一个映射变量,它就不起作用。下面的例子重现了我到目前为止所做的。

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。
我怎样才能成功地建立一个函数的索引?

r for-loop indexing purrr mutate
1个回答
0
投票

只需在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]>
© www.soinside.com 2019 - 2024. All rights reserved.