向 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)。
我的方法是使用 map2
、as_tibble
和 rbind
构建具有相同名称的 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
我想在小标题中添加一些虚拟案例。这是我的 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)。
我的方法是使用 map2
、as_tibble
和 rbind
构建具有相同名称的 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
.
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