我想要一个包含几个几乎相同的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中找到了几个类似的例子,但在这个具体问题上都没有帮助。
2条答案
按热度按时间5cg8jx4n1#
尝试在函数中使用
.data
代词:.data
是由map()
迭代的数据。1.现在我们可以在函数中使用
.data[[var]]
来引用所需的列(var
),并且可以使用map()
来迭代每个嵌套的tibble。mqkwyuun2#
使用
pick