2012-03-13 5 views
3

Это очень простой вопрос, но я надеюсь, что кто-то сможет помочь мне избежать лишних строк ненужного кода. У меня есть простой dataframe:Удаление NA при умножении столбцов

Df.1 <- data.frame(A = c(5,4,7,6,8,4),B = (c(1,5,2,4,9,1)),C=(c(2,3,NA,5,NA,9))) 

То, что я хочу сделать, это произвести дополнительный столбец, который является умножение А, В и С, которые я тогда cbind к первоначальному dataframe.

Итак, я обычно использую:

attach(Df.1) 
D<-A*B*C 

Но, очевидно, где NAs в колонке C, я получаю ЧА в переменной D. Я не хочу, чтобы исключить все строки NA, а просто игнорировать значения NA в этом столбце (а затем значение в D было бы просто умножением A и B или где C было доступно, A * B * C.

Я знаю, что я мог бы просто заменить NA с 1s , поэтому расчет остается неизменным или используется в случае, если вы делаете это, но я был занят тем, что упрощает этот процесс?

Любые идеи?

+0

Как насчет 'D <- A * B * (! C * is.na (C) + 1 * is.na (C))', что подлый способ обойти с помощью 'if'. –

+0

Было бы здорово, но я боюсь @CarlWitthoft, что строка кода не работает. –

+0

мои извинения - я не могу проверить/отладить прямо сейчас. Можете ли вы сказать мне, какая ошибка (или плохой результат)? –

ответ

3

Вы можете использовать prod, у которого есть аргумент na.rm. Для того, чтобы сделать это с помощью строки apply:

apply(Df.1,1,prod,na.rm=TRUE) 
[1] 10 60 14 120 72 36 
+0

Это действительно интересно @James, я никогда не использовал «prod» раньше - могу ли я спросить, для чего используется «1»? Кроме того, если у меня есть другие столбцы в моем наборе данных, но все же нужно только несколько A, B и C - есть ли способ указать столбцы, которые я хочу, чтобы он нашел продукт? –

+0

@KatieT 1 говорит 'apply' работать по-разному с помощью аргумента' MARGIN'. Чтобы ограничить количество столбцов, вам нужно будет передать только те столбцы, которые вы хотите использовать для 'apply', но это можно сделать inline:' apply (Df.1 [c ("A", "B", "C")], 1, prod, na.rm = T) ' – James

+0

Это именно то, что я хотел - спасибо @James! –

2

Как @James сказал, прод и применять будет работать, но вам не нужно тратить память хранить его в отдельной переменной, или даже cbinding его

Df.1$D = apply(Df.1, 1, prod, na.rm=T) 

Назначение новой переменной в фрейме данных будет работать.

> Df.1 <- data.frame(A = c(5,4,7,6,8,4),B = (c(1,5,2,4,9,1)),C=(c(2,3,NA,5,NA,9))) 
> Df.1 
    A B C 
1 5 1 2 
2 4 5 3 
3 7 2 NA 
4 6 4 5 
5 8 9 NA 
6 4 1 9 
> Df.1$D = apply(Df.1, 1, prod, na.rm=T) 
> Df.1$D 
[1] 10 60 14 120 72 36 
> Df.1 
    A B C D 
1 5 1 2 10 
2 4 5 3 60 
3 7 2 NA 14 
4 6 4 5 120 
5 8 9 NA 72 
6 4 1 9 36 
Смежные вопросы