2014-04-23 19 views
5

Jestem całkiem nowy dla R i napotkałem problem z NA. Na to pytanie można było odpowiedzieć gdzie indziej, ale nie mogę znaleźć odpowiedzi. Próbuję zrobić coś odwrotnego niż rowSums() w tym, że próbuję odjąć x2 i od x1 w celu wygenerowania x4 bez NA. Kod obecnie używam jest następująco:Odejmij wiele kolumn ignorując NA

> x <- data.frame(x1 = 3, x2 = c(4:1, 2:5), x3=c(1,NA)) 
> x$x4=x$x1-x$x2-x$x3 
> x 

    x1 x2 x3 x4 
1 3 4 1 -2 
2 3 3 NA NA 
3 3 2 1 0 
4 3 1 NA NA 
5 3 2 1 0 
6 3 3 NA NA 
7 3 4 1 -2 
8 3 5 NA NA 

Innymi słowy chcę ingore NA podobny do tego, jak rowSums umożliwia na.rm=TRUE argumentu, tak aby uzyskać ten wynik:

x1 x2 x3 x4 
1 3 4 1 -2 
2 3 3 NA 0 
3 3 2 1 0 
4 3 1 NA 2 
5 3 2 1 0 
6 3 3 NA 0 
7 3 4 1 -2 
8 3 5 NA -2 

Any pomoc jest bardzo doceniana.

Odpowiedz

2

Wystarczy użyć rowSums:

> x$x4 <- x$x1 - rowSums(x[,2:3], na.rm=TRUE) 
> x 
    x1 x2 x3 x4 
1 3 4 1 -2 
2 3 3 NA 0 
3 3 2 1 0 
4 3 1 NA 2 
5 3 2 1 0 
6 3 3 NA 0 
7 3 4 1 -2 
8 3 5 NA -2 
+0

Dzięki, sprytne rozwiązanie! Myślałem o tym w niewłaściwy sposób ... – rmbaughman

+1

Każdy pomysł, jak podejść do tego problemu, jeśli x1 i x2 zawierał również NA? – rmbaughman

+0

@ user3498787 Jak chcesz obsłużyć 'NA'? Czy są traktowane jako zera (jak w mojej odpowiedzi) czy też chcesz "NA" gdzie 'x1 == NA'? – Thomas

3

można użyć mniej więcej tak, jeśli wszystkie kolumny mają NAS -

x$x4 <- ifelse(is.na(x$x1),0,x$x1) -ifelse(is.na(x$x2),0,x$x2)-ifelse(is.na(x$x3),0,x$x3) 

Pod chcesz traktować NAS jako 0. jeszcze można wymienić w 0s powyższy wzór o wartości, której potrzebujesz.

Powiązane problemy