如何将变量名从'purrr::map()'传递给自定义函数?

zmeyuzjn  于 2023-03-20  发布在  其他
关注(0)|答案(2)|浏览(90)

我想要一个包含几个几乎相同的tibble的tibble。在每个嵌套的tibble中,一个变量的内容被打乱,其他的不变。我想要每个打乱的tibble有N个(例如10个)版本。

library(tidyverse)

df <- tibble(a = 1:5, b = 6:10, c = 11:15)
permutation_n <- 10
tbl_names <- names(df)

shuffle_var <- function(data, var) {
  data %>% 
    mutate({{var}} := sample({{var}}))
}

> shuffle_var(df, a)
# A tibble: 5 × 3
      a     b     c
  <int> <int> <int>
1     4     6    11
2     2     7    12
3     1     8    13
4     3     9    14
5     5    10    15

shuffle_var()工作正常,如果我单独使用它。
但是如果我在map()中使用它,它将返回一个tibble,原始变量不变,并返回一个名为.x的新变量

result <- 
  crossing(variable = tbl_names,
         index = 1:permutation_n) %>% 
  mutate(data = map(variable, ~shuffle_var(df, .x)),
  )

result %>% slice(1) %>% pull(data) %>% .[[1]]

# A tibble: 5 × 4
      a     b     c .x   
  <int> <int> <int> <chr>
1     1     6    11 a    
2     2     7    12 a    
3     3     8    13 a    
4     4     9    14 a    
5     5    10    15 a

result应该包含30行(变量x版本)。每个嵌套tibble应该有10个不同的版本,其中一个变量的值被打乱)。
我在SO中找到了几个类似的例子,但在这个具体问题上都没有帮助。

5cg8jx4n

5cg8jx4n1#

尝试在函数中使用.data代词:

  1. .data是由map()迭代的数据。
    1.现在我们可以在函数中使用.data[[var]]来引用所需的列(var),并且可以使用map()来迭代每个嵌套的tibble。
shuffle_var <- function(data, var) {
  data %>% 
    mutate({{var}} := sample(.data[[var]]))
}

result <- 
  crossing(variable = tbl_names,
           index = 1:permutation_n) %>% 
  mutate(data = map(variable, ~shuffle_var(df, .x))
  )

result %>% 
  slice(1) %>% pull(data) %>% .[[1]]

      a     b     c    .x
  <int> <int> <int> <int>
1     1     6    11     1
2     2     7    12     5
3     3     8    13     3
4     4     9    14     4
5     5    10    15     2
mqkwyuun

mqkwyuun2#

使用pick

shuffle_var <- function(data, var) {
  data %>% 
    mutate({{var}} := sample(pick(all_of(var))[[1]]))
}
  • 测试
out <- crossing(variable = tbl_names,
           index = 1:permutation_n) %>% 
  mutate(data = map(variable, ~shuffle_var(df, .x))
  )
> out$data[[1]]
# A tibble: 5 × 4
      a     b     c    .x
  <int> <int> <int> <int>
1     1     6    11     3
2     2     7    12     2
3     3     8    13     1
4     4     9    14     5
5     5    10    15     4

相关问题