在R中有条件地生成随机二进制变量

Generate random binary variable conditionally in R

我想添加一个额外的列,z 基于以下条件:

# Sample data
df <- tibble(
x = ("A", "C", "C", "B", "C", "A", "A"),
y = ("Y", "N", "Y", "N", "N", "N", "Y")) 

目前,我的方法使用 filter,然后是 set.seedrbinom,最后是 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