重新编码为以其他两个变量中的值为条件的新变量
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)
我希望能够根据两个现有变量中的特定值创建一个新变量。我的数据框看起来像:
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)