2013-06-16 4 views
3

Почему я получаю «4» для agenew (строка 23 второго отображения кадра данных) после выполнения инструкции ниже? Кажется, я должен получить «0».получение нечетного значения при попытке заменить NA при использовании R

agenew[is.na(agenew)] <- 4 * sibsp + 3 * parch 

Это кадр данных перед выполнением инструкции.

age sibsp agenew parch 
1 34.5  0  69  0 
2 47.0  1  98  0 
3 62.0  0 124  0 
4 27.0  0  54  0 
5 22.0  1  48  1 
6 14.0  0  28  0 
7 30.0  0  60  0 
8 26.0  1  56  1 
9 18.0  0  36  0 
10 21.0  2  50  0 
11 NA  0  NA  0 
12 46.0  0  92  0 
13 23.0  1  50  0 
14 63.0  1 130  0 
15 47.0  1  98  0 
16 24.0  1  52  0 
17 35.0  0  70  0 
18 21.0  0  42  0 
19 27.0  1  58  0 
20 45.0  0  90  0 
21 55.0  1 114  0 
22 9.0  0  18  1 
23 NA  0  NA  0 

Это dataframe после выполнения оператора

> newdf 
    age sibsp agenew parch 
1 34.5  0  69  0 
2 47.0  1  98  0 
3 62.0  0 124  0 
4 27.0  0  54  0 
5 22.0  1  48  1 
6 14.0  0  28  0 
7 30.0  0  60  0 
8 26.0  1  56  1 
9 18.0  0  36  0 
10 21.0  2  50  0 
11 NA  0  0  0 
12 46.0  0  92  0 
13 23.0  1  50  0 
14 63.0  1 130  0 
15 47.0  1  98  0 
16 24.0  1  52  0 
17 35.0  0  70  0 
18 21.0  0  42  0 
19 27.0  1  58  0 
20 45.0  0  90  0 
21 55.0  1 114  0 
22 9.0  0  18  1 
23 NA  0  4  0 
+1

попробуйте, может быть, 'newdf $ agenew []. (Newdf $ agenew)] <- 4 * newdf $ sibsp + 3 * newdf $ parch' – haki

ответ

5

Пусть n быть число строк в вашем data.frame и m (где m < n) количество строк, где agenew является NA. Ведение

agenew[is.na(agenew)] <- 4 * sibsp + 3 * parch 

неправильно, потому что левая часть имеет длину m в то время как правая часть имеет длину n. Это «4» вы получаете в качестве замены agenew на строке 23 (второй раз agenew является NA) является результатом 4 * sibsp + 3 * parch на второй строке вашего data.frame, а не 23 ...

Что вы имел в виду, чтобы сделать это:

agenew[is.na(agenew)] <- (4 * sibsp + 3 * parch)[is.na(agenew)] 

но есть более элегантные способы сделать это, например:

agenew <- ifelse(is.na(agenew), 4 * sibsp + 3 * parch, agenew) 

где здесь, все векторы имеют длину n.

Примечание: Как вы делали в вашем вопросе, я пропуская ту часть, где все эти заявления должны быть оценены в пределах вашего data.frame (см with, within, transform и т.д.), например:

df <- transform(df, agenew = ifelse(is.na(agenew), 4 * sibsp + 3 * parch, agenew)) 
+0

Посмотрев на ваше предложение, функция ifelse выглядит как лучший подход ко мне. Я буду использовать его. –

+0

Я немного неудобен при использовании R. Я повторил функцию data.frame для оценки newdf. newdf <- data.frame (возраст, сибсп, agenew, parch). Ваше предложение кажется лучше, и я постараюсь запомнить его в будущем. Спасибо, Уоррен –