Я согласен (с 42-), что вложенные ifelse
операторы не являются предпочтительными.@ 42-х решение match
намного лучше (* imo), чем ifelse
с.
Альтернативой является merge
их.
Данные:
grass <- read.table(text="line cube.root.height
high 4.13
high 5.36
low 4.37
high 5.08
junk 4.85
high 5.59
", head=TRUE, stringsAsFactors=FALSE)
Таблица значений для объединения:
genome <- data.frame(
line=c("high","low","bl","bh"),
genome.inherited=c(1, 0, 0.25, 0.75),
stringsAsFactors=FALSE)
Слияние:
grass2 <- merge(grass, genome, by="line", all.x=TRUE)
Если вы посмотрите на данные, вы увидите NA
, потому что"junk"
(неизвестное значение) отсутствует в таблице genome
и поэтому присваивается как NA
.Мы можем исправить это простым шагом:
grass2$genome.inherited[is.na(grass2$genome.inherited)] <- 0.5
grass2
# line cube.root.height genome.inherited
# 1 high 4.13 1.0
# 2 high 5.36 1.0
# 3 high 5.08 1.0
# 4 high 5.59 1.0
# 5 junk 4.85 0.5
# 6 low 4.37 0.0
@ 42-ой имеет преимущество, заключающееся в предоставлении значения по умолчанию (nomatch
) при первоначальном вызове.