[英]Generate random binary variable conditionally in R
我想根據以下條件添加一個額外的列z
:
x == "A"
,假設成功概率 (=1) 為 0.5,生成一個二元變量x == "C" & y == "N"
,假設成功概率為 0.25,生成一個二元變量。# Sample data
df <- tibble(
x = ("A", "C", "C", "B", "C", "A", "A"),
y = ("Y", "N", "Y", "N", "N", "N", "Y"))
目前,我的方法使用filter
,然后set.seed
和rbinom
,最后是rbind
。 但我正在尋找一種更優雅的解決方案,它不涉及對數據進行子集化和重新連接。
這是dplyr::case_when
的一個很好的案例,因為您使用的是tidyverse
函數。
library(dplyr)
set.seed(1)
df %>%
mutate(z = case_when(x == "A" ~ rbinom(n(), 1, 0.5),
x == "C" & y == "N" ~ rbinom(n(), 1, 0.25)))
# A tibble: 7 x 3
# Rowwise:
x y z
<chr> <chr> <int>
1 A Y 0
2 C N 1
3 C Y NA
4 B N NA
5 C N 0
6 A N 0
7 A Y 1
您可以將您的邏輯放入一個簡單的if / else
結構中,並將其包裝在 function g()
中。
g <- \(z) {
if (z['x'] == 'A') {
rbinom(1, 1, .5)
}
else if (z['x'] == 'C' & z['y'] == 'N') {
rbinom(1, 1, .25)
} else {
NA
}
}
set.seed(42)
transform(df, z=apply(df, 1, g))
# x y z
# 1 A Y 1
# 2 C N 1
# 3 C Y NA
# 4 B N NA
# 5 C N 0
# 6 A N 1
# 7 A Y 1
您可以嘗試像下面這樣嵌套ifelse
transform(
df,
z = suppressWarnings(
rbinom(
nrow(df), 1,
ifelse(x == "A", 0.5,
ifelse(x == "C" & y == "N", 0.25, NA)
)
)
)
)
這使
x y z
1 A Y 1
2 C N 0
3 C Y NA
4 B N NA
5 C N 1
6 A N 1
7 A Y 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.