簡體   English   中英

在 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.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結構中,並將其包裝在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM