以下是您的第一个问题。我们可以使用dplyr 和purrr 中的函数来实现这一点。
set.seed(1)
# Create example data frame
dat <- data.frame(A = rep(1:4, times = 25),
B = c(rep(c("a", "b", "c"), times = 33), "a"),
stringsAsFactors = FALSE)
library(dplyr)
library(purrr)
dat2 <- dat %>%
group_split(A) %>%
map2_dfr(c(0.2, 0.2, 0.35, 0.25), ~sample_frac(.x, .y))
dat2
# # A tibble: 25 x 2
# A B
# <int> <chr>
# 1 1 a
# 2 1 a
# 3 1 a
# 4 1 a
# 5 1 b
# 6 2 c
# 7 2 c
# 8 2 c
# 9 2 a
# 10 2 b
# # ... with 15 more rows
这是针对您的问题 2。我们需要计算每个组合的联合概率。之后,我们可以为此应用与问题1类似的代码。
set.seed(1)
# Create a larger data frame for demonstration
dat3 <- do.call("rbind", replicate(100, dat, simplify = FALSE))
# Calculate the joint probability
p1 <- c("1" = 0.2, "2" = 0.2, "3" = 0.35, "4" = 0.25)
p2 <- c("a" = 0.2, "b" = 0.3, "c" = 0.5)
p <- as.vector(t(outer(p1, p2)))
dat4 <- dat3 %>%
group_split(A, B) %>%
map2_dfr(p, ~sample_frac(.x, .y))
# Verify the results
dat4 %>%
count(A) %>%
mutate(P = n/nrow(dat4))
# # A tibble: 4 x 3
# A n P
# <int> <int> <dbl>
# 1 1 164 0.197
# 2 2 166 0.199
# 3 3 298 0.358
# 4 4 205 0.246
dat4 %>%
count(B) %>%
mutate(P = n/nrow(dat4))
# # A tibble: 3 x 3
# B n P
# <chr> <int> <dbl>
# 1 a 169 0.203
# 2 b 246 0.295
# 3 c 418 0.502