R: заменить NA на элемент из вектора - PullRequest
8 голосов
/ 13 июля 2011

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

Мои данные выглядят так:

   X   Y
1  x   y
2  x   y
3  NA  y
4  x   y

И я хочу, чтобы это выглядело так:

  X   Y
1  x   y
2  x   y
3  y   y
4  x   y

Я написал это, и это сработало

for(i in 1:nrow(data.frame){
   if( is.na(data.frame$X[i]) == TRUE){
       data.frame$X[i] <- data.frame$Y[i]
   }
  }

Но мой data.frame имеет длину почти полмиллиона строк, а операторы for / if довольно медленные. Я хочу что-то вроде

is.na(data.frame$X) <- data.frame$Y

Но получается ошибка несоответствующего размера. Кажется, что должна быть команда, которая делает это, но я не могу найти ее здесь в SO или в справочном списке R. Есть идеи?

Ответы [ 3 ]

10 голосов
/ 14 июля 2011

ifelse ваш друг.

Использование набора данных Дирка

df <- within(df, X <- ifelse(is.na(X), Y, X))
8 голосов
/ 13 июля 2011

Просто векторизуйте его - тест логического индекса - это одно выражение, и вы также можете использовать его в назначении.

Настройка данных:

R> df <- data.frame(X=c("x", "x", NA, "x"), Y=rep("y",4), stringsAsFactors=FALSE)
R> df
     X Y
1    x y
2    x y
3 <NA> y
4    x y

И затем продолжитьвычисление индекса того, где заменить, и заменить:

R> ind <- which( is.na( df$X ) )
R> df[ind, "X"] <- df[ind, "Y"]

, что дает желаемый результат:

R> df
  X Y
1 x y
2 x y
3 y y
4 x y
R> 
0 голосов
/ 03 ноября 2014

К сожалению, я пока не могу комментировать, но при векторизации некоторого кода, где были задействованы строки или символы, вышеприведенное, похоже, не работает.Причина, объясняемая в этом ответе .Если задействованы символы, stringsAsFactors=FALSE недостаточно, поскольку R, возможно, уже создал факторы из символов.Необходимо убедиться, что данные снова становятся символьным вектором, например, data.frame(X=as.character(c("x", "x", NA, "x")), Y=as.character(rep("y",4)), stringsAsFactors=FALSE)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...