根据其他两个变量的值重新编码为新变量

时间:2018-08-28 02:10:09

标签: r recode

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

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)填充新列中的每个单元格。

1 个答案:

答案 0 :(得分:0)

由于NA的存在,使用索引直接分配值变得棘手。我们可以使用replace代替将任何非“蓝色”的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)