2015-05-26 4 views
1

Существует два вектора x и y. Если x содержит NA, я хочу заменить NA на значение от «y» с соответствующим индексом. Вот пример кода, который работает:Применить функцию к двум векторам путь «R»?

x <- c(1,2,3,NA,5) 
y <- c(6,7,8,9,10) 

combineVector <- function(x,y) 
{ 
    for (i in 1:length(x)){ 
    if (is.na(x[i]) && !is.na(y[i])){ 
     x[i] = y[i] 
    } 
    } 
    return (x) 
    } 
combineVector(x,y) 
# [1] 1 2 3 9 5 

Я мог бы написать это практически на любом языке программирования. Есть ли способ «R» выполнить эту задачу?

+2

в этом примере 'рмин (х, у, na.rm = TRUE)' также будет работать – rawr

+0

Хотя это будет работать в этом примере, код в принципе не выполняет то, что запросил OP, и потерпит неудачу, если какой-либо элемент y меньше его соответствующего элемента x. Поскольку это часто случается в различных случаях использования, вы не должны предлагать это в качестве решения. – jrdnmdhl

ответ

4
x <- c(1,2,3,NA,5) 
y <- c(6,7,8,9,10) 

x[is.na(x)] <- y[is.na(x)] 

См. Выше. using is.na() на x возвращает логический вектор, где он ИСТИНА для элементов NA элемента x. Используя их в селекторе для X и Y, выберем только те элементы NA. Использование его в присваивании заменит элементы NA из x соответствующими из Y.

Это будет намного быстрее, чем цикл, когда вектор станет большим.

+4

Без переопределения вы также можете выполнить замену (x, is.na (x), y [is.na (x)]) ' – thelatemail

+0

Спасибо, очень полезно, если вы хотите сохранить исходные значения для x ... – jrdnmdhl

3

Попробуйте этот код:

x[is.na(x)] <- y[is.na(x)] 

По Подменю в x вектор с is.na(x) вы будете назначая только те значения, которые xNA к соответствующим показателям в y векторе.

0

Чтобы создать новый вектор принимая x и y в качестве входных данных, вы можете использовать функцию ifelse:

x<-c(1,2,3,NA,NA) 
y<-c(6,7,8,9,NA) 
ifelse(is.na(x), y, x) 
# [1] 1 2 3 9 NA