Добавление информации в столбец условного сравнения строк - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть фрейм данных под названием "трава".Одной из данных в этом фрейме данных является «Линия», которая может быть: высокая, низкая, f1, f2, bl или bh.

Я создал новый столбец и хочу добавить информацию в этот столбец следующим образомкод показывает.

Проблема в том, что я получаю «1» для всех, а не только для «высокого» * ​​1005 *

#add new column
grass["genome.inherited"] <- NA

#adding information to genome.inherited 
#1 for the high-tolerance parent genotype (high)
#0 for the low-tolerance parent genotype  (low)
#0.5 for the F1 and F2 hybrids (f1) (f2)
#0.25 for the backcross to the low tolerance population (bl)
#0.75 for the backcross to the high tolerance population (bh)

#how I tried to solve the problem
grass$genome.inherited <- if(grass$line == 'high'){
    1
} else if(grass$line == 'low'){
    0
} else if(grass$line == 'bl'){
    0.25
} else if(grass$line == 'bh'){
    0.75
} else {
    0.5
}

Как и здесь предлагается вывод для головы (трава)

line cube.root.height genome.inherited
high             4.13                1
high             5.36                1
high             4.37                1
high             5.08                1
high             4.85                1
high             5.59                1

Спасибо!

Ответы [ 4 ]

0 голосов
/ 02 декабря 2018

Я согласен (с 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) при первоначальном вызове.

0 голосов
/ 02 декабря 2018

Ваши if условия имеют длину> 1. Когда условие имеет длину> 1, будет использоваться только первый элемент, и поэтому вы получаете все 1 с.

Вот другое (прощечем вложенный ifelse) подход к тому же -

vals <- c(high = 1, low = 0, f1 = 0.5, f2 = 0.5, bl = 0.25, bh = 0.75)

grass$genome.inherited <- vals[as.character(grass$line)]
0 голосов
/ 02 декабря 2018

Как насчет использования функции match.Он дает число, указывающее позицию значения в символьном векторе, а также имеет значение «nomatch».

grass$genome.inherited <- c(1, 0, 0.25, 0.75, 0.5)[ 
                        match( grass$line, c( 'high', 'low','bl','bh'), nomatch=5) ]

Пример из консоли с другими значениями строки для проверки:

 grass <- read.table(text="line cube.root.height genome.inherited
 high             4.13                1
 high             5.36                2
 low             4.37                1
 high             5.08                1
 junk             4.85                1
 high             5.59                1
 ", head=T)

 grass$genome.inherited <- c(1, 0, 0.25, 0.75, 0.5)[ 
                       match( grass$line, c( 'high', 'low','bl','bh'), nomatch=5) ]
 grass
#----
  line cube.root.height genome.inherited
1 high             4.13              1.0
2 high             5.36              1.0
3  low             4.37              0.0
4 high             5.08              1.0
5 junk             4.85              0.5
6 high             5.59              1.0
0 голосов
/ 02 декабря 2018

Вам не нужно создавать новый столбец с NA.Вот код, который делает это за вас.

grass$genome_inherited_values <- ifelse(grass$line == 'high', 1,
                  ifelse(grass$line == 'low', 0,
                         ifelse(grass$line == 'bl',0.25,
                                ifelse(grass$line == 'bh',0.75,0.5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...