在R中有条件地生成随机二进制变量
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
结构中,并将其包装在一个函数中 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
我想添加一个额外的列,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
结构中,并将其包装在一个函数中 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