根据彼此创建变量的data.frame

时间:2017-09-19 11:45:57

标签: r if-statement dataframe dplyr simulation

我想根据彼此的变量创建一个数据框。我可以使用这个dplyr样式代码来完成此任务:

p.1 <- .1
p.2 <- .3
p.3 <- .6
l <- 1e2

df <- data.frame(
  var.1 =
    sample(0:1, l, prob = c(1 - p.1, p.1), replace = TRUE))

df <- df %>%
    mutate(
  var.2 = ifelse(
    var.1 == 1, 0,
    sample(0:1, l, prob = c(1 - p.2, p.2), replace = TRUE)),
  var.3 = ifelse(
    var.1 == 1 | var.2 == 1, 0,
    sample(0:1, l, prob = c(1 - p.3, p.3), replace = TRUE))
)

更好的是一步创建df,但这不起作用,因为找不到var.1:

df <- data.frame(
  var.1 =
    sample(0:1, l, prob = c(1 - p.1, p.1), replace = TRUE),
  var.2 = ifelse(
    var.1 == 1, 0,
    sample(0:1, l, prob = c(1 - p.2, p.2), replace = TRUE)
    ),
  var.3 = ifelse(
    var.1 == 1 | var.2 == 1, 0,
    sample(0:1, l, prob = c(1 - p.3, p.3), replace = TRUE)
    )
  )

另一次创建空df的尝试也不起作用,这会在mutate_impl(.data,dots)中抛出错误错误:列var.1必须是长度为0(行数)或一个,而不是100

df <- data.frame()
df <- df %>%
  mutate(
    var.1 =
      sample(0:1, l, prob = c(1 - p.1, p.1), replace = TRUE),
    var.2 = ifelse(
      var.1 == 1, 0,
      sample(0:1, l, prob = c(1 - p.2, p.2), replace = TRUE)
      ),
    var.3 = ifelse(
      var.1 == 1 | var.2 == 1, 0,
      sample(0:1, l, prob = c(1 - p.3, p.3), replace = TRUE)
      )
  )

实际上我有更多的变量,我想要一个更经济的解决方案来完成这项任务。

1 个答案:

答案 0 :(得分:1)

你很亲密

df <- data.frame(
  var.1 =
    sample(0:1, l, prob = c(1 - p.1, p.1), replace = TRUE)) %>%  # create data frame with var.1 first, then mutate
    mutate(
  var.2 = ifelse(
    var.1 == 1, 0,
    sample(0:1, l, prob = c(1 - p.2, p.2), replace = TRUE)),
  var.3 = ifelse(
    var.1 == 1 | var.2 == 1, 0,
    sample(0:1, l, prob = c(1 - p.3, p.3), replace = TRUE))
)