向 tibble 添加行的更简单方法? (虚拟案例,TRUE/FALSE 样本)

easier way to add rows to a tibble? (dummy cases, TRUE/FALSE sample)

我想在小标题中添加一些虚拟案例。这是我的 tibble 的一个非常简化的版本(原来的 table 有 > 100 列并且它不是空的):

Test <- tibble(A1 = logical(),
               A2 = logical(),
               A3 = logical(),
               A4 = logical(),
               A5 = logical(),
               other_stuff = character())

这是一个创建虚拟案例的函数(N 是数字或“答案”,prob_T 是正确的概率):

make_dummy_case <- function(N, prob_T) {
    sample(c(TRUE, FALSE), N, prob = c(prob_T, (1 - prob_T)), replace=TRUE)}

因此,make_dummy_case(5, 0.5) 将产生五个“答案”(或长度为 N 的逻辑向量),其正确概率为 50/50。

现在我想在小标题中添加许多具有不同概率的虚拟案例(将 N * 5 个虚拟答案添加到 A1:A5)。

我的方法是使用 map2as_tibblerbind 构建具有相同名称的 tibble。我以某种方式成功了,但解决方案对我来说看起来很复杂。 有没有更简单的方法?

dummy_cases <- as_tibble(map2(5, seq(0, 1, by = 0.02), make_dummy_case), .name_repair = "unique")
dummy_cases <- as_tibble(t(dummy_cases), .name_repair = "unique")
dummy_cases <- mutate(dummy_cases, other_stuff = NA_character_)
names(dummy_cases) <- names(Test)
rbind(Test, dummy_cases)

Return 来自函数 make_dummy_case.

的 1 X 5 dataframe/tibble
library(dplyr)
library(purrr)

make_dummy_case <- function(N, prob_T) {
  sample(c(TRUE, FALSE), N, prob = c(prob_T, (1 - prob_T)), replace=TRUE) %>%
    t %>%
    as.data.frame() %>%
    setNames(paste0('A', 1:5)) %>%
    tibble()
}

那么你可以这样做:

bind_rows(Test, map2_df(5, seq(0, 1, by = 0.02), make_dummy_case))

# A tibble: 51 x 6
#   A1    A2    A3    A4    A5    other_stuff
#   <lgl> <lgl> <lgl> <lgl> <lgl> <chr>      
# 1 FALSE FALSE FALSE FALSE FALSE NA         
# 2 FALSE FALSE FALSE FALSE FALSE NA         
# 3 FALSE FALSE FALSE FALSE FALSE NA         
# 4 TRUE  FALSE FALSE FALSE FALSE NA         
# 5 TRUE  FALSE FALSE TRUE  FALSE NA         
# 6 TRUE  FALSE FALSE FALSE TRUE  NA         
# 7 FALSE FALSE FALSE FALSE FALSE NA         
# 8 FALSE FALSE FALSE FALSE FALSE NA         
# 9 TRUE  FALSE FALSE FALSE FALSE NA         
#10 FALSE FALSE TRUE  TRUE  FALSE NA         
# … with 41 more rows