2017-01-25 17 views
0

Есть ли быстрый способ запуска нескольких арифметических операций между переменными фрейма данных при игнорировании случаев с NA? Ниже я приведу простой пример.Как выполнять несколько операций, игнорируя NA, в R

Кажется, я могу добавить промежуточные переменные или выражения if, но это кажется слишком запутанным.

d1<-c(2,2,2,2) 
d2<-c(1,1,1,1) 
d3<-c(1,1,NA,NA) 

df<-data.frame(d1,d2,d3) 
df 
    d1 d2 d3 
1 2 1 1 
2 2 1 1 
3 2 1 NA 
4 2 1 NA 

df$d4<-d1*((d2) + (d3)) 
df 
    d1 d2 d3 d4 
1 2 1 1 4 
2 2 1 1 4 
3 2 1 NA NA 
4 2 1 NA NA 

То, что я хотел бы получить это:

df2<-data.frame(d1,d2,d3,d4=c(4,4,2,2)) 
    df2 
     d1 d2 d3 d4 
    1 2 1 1 4 
    2 2 1 1 4 
    3 2 1 NA 2 
    4 2 1 NA 2 

Я мог бы заменить все значения с 0s пока что также может ввести в заблуждение.

EDIT:

Я попытался преобразовать Nas в 0s, но он не работает, и я не понимаю, почему.

df<-data.frame(d1,d2,d3) 
df 
df[is.na(df)] <- 0 
df 
    d1 d2 d3 
1 2 1 1 
2 2 1 1 
3 2 1 0 
4 2 1 0 
df$d4<-d1*((d2) + (d3)) 
df 
    d1 d2 d3 d4 
1 2 1 1 4 
2 2 1 1 4 
3 2 1 0 NA 
4 2 1 0 NA 
+3

Может ли 'd1 * rowSums (df [-1], na.rm = TRUE)' –

+3

Это не логика NA. Кажется, вы хотите, чтобы NA рассматривалось как 0, поэтому измените значения NA на 0. (в конечном итоге в копии вашего фрейма данных) – jogo

+0

@DavidArenburg: я думал об этом, но он недостаточно общий, если мои другие переменные (те, что в rowSums) умножаются на дополнительные факторы или константы. – val

ответ

1

Если вы хотите изменить все Nas до 0 вы можете сделать:

d1<-c(2,2,2,2) 
d2<-c(1,1,1,1) 
d3<-c(1,1,NA,NA) 

df<-data.frame(d1,d2,d3) 
df.new <- as.data.frame(lapply(df, function(x) ifelse(is.na(x), 0, x))) 

или (благодаря SOTOS!):

df[is.na(df)] <- 0 

Но будьте осторожны: это будет хорошо работать для фреймов данных со всеми столбцами числовыми. В других случаях вы можете столкнуться с проблемами.

+3

Почему бы не просто 'df [is.na (df)] <- 0'? – Sotos

+0

yes - упрощение работает лучше всего, так как my df - это смесь классов, и использование ответа jogo, к сожалению, беспорядочно (без ограничений). – val

+1

@val Вы можете работать только с числовыми столбцами (используйте индексы столбцов). – jogo