2015-04-18 7 views
2

Мой набор данных составлен, как показано ниже.Как заполнить недостающие значения из другой переменной?

x y 
0  
0 0 
2 2 
    2 
    4 
2 
7 7 

Я хочу объединить х и у переменной, как этот

x 
0  
0 
2 
2 
4 
2 
7 

То есть, я хочу, чтобы заполнить значения переменной х с у значений переменных, если х отсутствуют. Если в обеих переменных x и y отсутствует, два значения всегда одинаковы.

+0

являются пустыми ' ''' или 'NA'? Если '' '' это означает, что ваш столбец, содержащий цифры, действительно имеет тип символа. –

ответ

3

Другой вариант

x = ifelse(is.na(x), y,x) 
+0

Действительно элегантный ответ. – DHW

3

Просто скопируйте y значения для отсутствующих x значений

x <- c(0,0,2,NA,NA,2,7) 
y <- c(NA,0,2,2,4,NA,7) 

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

Если отсутствующее не является NA, как мне это сделать? –

+0

Ну, что значит «отсутствует»? Если это не NA, то сделайте то, что когда-либо было подходящим для индексации. – MrFlick

+0

сделайте это 'gsub (" \\ s ", NA, dataset)' перед ответом и проверкой MrFlick –

2

Как ваши данные уже в data.frame кажется:

df <- data.frame(x = c(0,0,2,NA,NA,2,7), y = c(NA,0,2,2,4,NA,7)) 

Тогда просто получите большее значение из столбцов:

> apply(df, 1, max, na.rm = TRUE) 
[1] 0 0 2 2 4 2 7 
2

Если, как вы говорите, что оба x и y одинаковы, когда нет пропущенных значений, вы можете легко векторизации с rowMeans или использовать pmax (или pmin) в сочетании с do.call

Ваши данные

df <- data.frame(x = c(0,0,2,NA,NA,2,7), y = c(NA,0,2,2,4,NA,7)) 

Решение # 1

rowMeans(df, na.rm = TRUE) 
## [1] 0 0 2 2 4 2 7 

Решение # 2

do.call(pmax, c(df, na.rm = TRUE)) # or do.call(pmin, c(df, na.rm = TRUE)) 
## [1] 0 0 2 2 4 2 7 

Для сравнения, это потеряет только @MrFlicks подход на относительно больших данных

n <- 1e5 
dftest <- data.frame(x = as.vector(replicate(n, df$x)), 
        y = as.vector(replicate(n, df$y))) 

library(microbenchmark) 
microbenchmark(ifelse(is.na(dftest$x), dftest$y, dftest$x), 
       dftest$x[is.na(dftest$x)] <- dftest$y[is.na(dftest$x)], 
       apply(dftest, 1, max, na.rm = TRUE), 
       rowMeans(dftest, na.rm = TRUE), 
       do.call(pmax, c(dftest, na.rm = TRUE))) 

# Unit: milliseconds 
#             expr  min   lq  mean  median   uq  max neval 
#   ifelse(is.na(dftest$x), dftest$y, dftest$x) 121.16554 132.17962 188.81260 162.88925 242.37786 452.3506 100 
# dftest$x[is.na(dftest$x)] <- dftest$y[is.na(dftest$x)] 32.46432 34.13887 45.88664 36.78413 42.72560 138.9821 100 
#     apply(dftest, 1, max, na.rm = TRUE) 2284.13414 2428.15899 2554.03813 2501.33842 2605.78132 3567.5111 100 
#       rowMeans(dftest, na.rm = TRUE) 40.04718 44.39996 61.89289 48.16691 54.88427 189.2017 100 
#     do.call(pmax, c(dftest, na.rm = TRUE)) 44.68004 45.66772 52.64246 46.43867 50.02424 149.1624 100 
Смежные вопросы