Объединение опроса в R / Recoding NA - PullRequest
3 голосов
/ 11 января 2011

У меня есть два списка (из многоволнового опроса), которые выглядят так:

X1 X2
1  NA
NA  2
NA  NA

Как я могу легко объединить это в третий элемент, где третий столбец всегда принимает не-NAзначение столбца X1 или X2 и кодов NA, когда оба значения равны NA?

Ответы [ 4 ]

5 голосов
/ 11 января 2011

Сочетание использования Гэвином within и использования Прасадом ifelse дает нам более простой ответ.

within(df, x3 <- ifelse(is.na(x1), x2, x1))

Несколько вызовов ifelse не нужны - когда оба значения NA, вы можете просто принять одно из значений напрямую.

3 голосов
/ 11 января 2011

Другой способ использования ifelse:

df <- data.frame(x1 = c(1, NA, NA, 3), x2 = c(NA, 2, NA, 4))
> df
  x1 x2
1  1 NA
2 NA  2
3 NA NA
4  3  4

> transform(df, x3 = ifelse(is.na(x1), ifelse(is.na(x2), NA, x2), x1))
  x1 x2 x3
1  1 NA  1
2 NA  2  2
3 NA NA NA
4  3  4  3
2 голосов
/ 11 января 2011

Это требует немного дополнительного изящества из-за возможности того, что X1 и X2 будут NA, но эту функцию можно использовать для решения вашей проблемы:

foo <- function(x) {
    if(all(nas <- is.na(x))) {
        NA
    } else {
        x[!nas]
    }
}

Мыиспользуйте функцию foo, применяя ее к каждой строке ваших данных (здесь у меня есть ваши данные в объекте с именем dat):

> apply(dat, 1, foo)
[1]  1  2 NA

Так что это дает нам то, что мы хотим.Чтобы включить это в ваш объект, мы делаем это:

> dat <- within(dat, X3 <- apply(dat, 1, foo))
> dat
  X1 X2 X3
1  1 NA  1
2 NA  2  2
3 NA NA NA
0 голосов
/ 12 января 2011

Вы не сказали, что хотели сделать, когда оба были действительными числами, но вы можете использовать либо pmax, либо pmin с аргументом na.rm:

 pmax(df$x1, df$x2, na.rm=TRUE)
# [1]  1  2 NA  4
...