Перекодировать в новую переменную условно на значения в двух других переменных - PullRequest
0 голосов
/ 28 августа 2018

Я хотел бы иметь возможность создать новую переменную на основе определенных значений в двух существующих переменных. Мой фрейм данных выглядит так:

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 голосов
/ 28 августа 2018

Из-за наличия 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)
...