Вопрос с R. Элементное умножение, сложение и деление с 2 data.frames с различным количеством пропущенных данных в данной строке - PullRequest
1 голос
/ 15 мая 2010

У меня есть различные data.frames со столбцами одинаковой длины, где я пытаюсь объединить 2 строки в несколько элементов, а затем суммировать это. Например, ниже приведены два вектора, с которыми я хотел бы выполнить эту операцию.

> a.1[186,]
q01_a q01_b q01_c q01_d q01_e q01_f q01_g q01_h q01_i q01_j q01_k q01_l q01_m
    3     3     3     3     2     2     2     3     1    NA    NA     2     2

и

> u.1[186,]
q04_avl_a q04_avl_b q04_avl_c q04_avl_d q04_avl_e q04_avl_f q04_avl_g q04_avl_h q04_avl_i q04_avl_j q04_avl_k q04_avl_l q04_avl_m        
        4         2         3         4         3         4         4         4         3         4         3         3         3`

Проблема в том, что разные строки имеют различное количество NA. То, что я хотел бы сделать, это пропустить умножение с любыми пропущенными значениями (10-я и 11-я позиции из моего примера выше), а затем после сложения разделить на количество умноженных элементов (11 из примера выше). Большинство строк заполнены и будут умножены на 13.

Спасибо!

Ответы [ 2 ]

8 голосов
/ 15 мая 2010
x <- c(3,3,3,3,2,2,2,3,1,NA,NA,2,2)
y <- c(4,2,3,4,3,4,4,4,3,4,3,3,3)

sum(x*y,na.rm = T)/sum(!is.na(x*y))
[1] 8

EDIT

В случае факторов сначала конвертируйте их в числовые

x <- as.factor(c(3,3,3,3,2,2,2,3,1,NA,NA,2,2))
y <- as.factor(c(4,2,3,4,3,4,4,4,3,4,3,3,3))
xy <- as.numeric(as.character(x)) * as.numeric(as.character(y))
sum(xy,na.rm = T)/sum(!is.na(xy))
[1] 8
1 голос
/ 15 мая 2010

Достигнуть некоторого прогресса здесь. Я использовал substituteNA из пакета Fseries, чтобы заменить все пропущенные значения нулями.

> sum(a.11[186,]*u.11[186,])/min((rowSums(a.11!=0)), rowSums(u.11!=0))

Теперь мне просто нужно сделать эту работу в цикле!

...