重新编码为以其他两个变量中的值为条件的新变量

Recode into new variable conditional on values in two other variables

我希望能够根据两个现有变量中的特定值创建一个新变量。我的数据框看起来像:

structure(list(id = structure(c(1L, 2L, 3L, NA, NA, NA), .Label = c("blue", 
"red", "yellow"), class = "factor"), value = c(-4.3, -2.5, -3.6, 
NA, NA, NA)), .Names = c("id", "value"), row.names = c(NA, -6L
), class = "data.frame")

我想创建一个新列,其中只包含那些与蓝色相关的值(例如 4.2)。所有其他值都会导致 NA,如下所示:

structure(list(id = structure(c(1L, 2L, 3L, NA, NA, NA), .Label = c("blue", 
"red", "yellow"), class = "factor"), value = c(-4.3, -2.5, -3.6, 
NA, NA, NA), newvalue = c(-4.3, NA, NA, NA, NA, NA)), .Names = c("id", 
"value", "newvalue"), row.names = c(NA, -6L), class = "data.frame")

我尝试了以下方法:

b1 <- dat$id=="blue"
dat$newvalue <- dat$value[b1]

但是新列中的每个单元格都填充了相同的值 (-4.3)。

由于 NA 的存在,直接使用索引分配值变得很棘手。我们可以使用 replace 而不是将任何非 "blue" value 替换为 NA.

dat$newvalue <- replace(dat$value, dat$id != "blue", NA)

dat
#      id value newvalue
#1   blue  -4.3     -4.3
#2    red  -2.5       NA
#3 yellow  -3.6       NA
#4   <NA>    NA       NA
#5   <NA>    NA       NA
#6   <NA>    NA       NA

等效的 ifelse 语句为:

dat$newvalue <- ifelse(dat$id != "blue", NA, dat$value)