2014-01-10 5 views
0

Как я могу суммировать количество полных случаев из двух столбцов?R Сумма полных случаев из двух столбцов

С c равным:

 a b 
[1,] NA NA 
[2,] 1 1 
[3,] 1 1 
[4,] NA 1 

Применение что-то вроде

rollapply(c, 2, function(x) sum(complete.cases(x)),fill=NA) 

Я хотел бы получить обратно один номер, 2 в этом случае. Это будет для большого набора данных со многими столбцами, поэтому я бы хотел использовать rollapply по всему набору, а не просто делать sum(complete.cases(a,b)).

Могу я подумать?

Спасибо!

+1

К какому пакету относится 'rollapply'? И я не понимаю, почему 'sum (complete.cases (c))' не должен быть лучшим кодом для вашей проблемы. – Beasterfield

ответ

1

Вы можете рассчитать количество полных случаев в соседних столбцах матрицы с использованием rollapply как это:

m <- matrix(c(NA,1,1,NA,1,1,1,1),ncol=4) 
#  [,1] [,2] [,3] [,4] 
#[1,] NA 1 1 1 
#[2,] 1 NA 1 1 

library(zoo) 

rowSums(rollapply(is.na(t(m)), 2, function(x) !any(x))) 
#[1] 0 1 2 
+0

Спасибо, это то, что я искал! –

2

Вы попробовали sum(complete.cases(x))?!

set.seed(123) 
x <- matrix(sample(c(NA,1:5) , 15 , TRUE) , 5) 
#  [,1] [,2] [,3] 
#[1,] 1 NA 5 
#[2,] 4 3 2 
#[3,] 2 5 4 
#[4,] 5 3 3 
#[5,] 5 2 NA 


sum(complete.cases(x)) 
#[1] 3 

Чтобы найти complete.cases() первых двух столбцов:

sum(complete.cases(x[,1:2])) 
#[1] 4 

И к apply двух столбцов matrix через всю матрицу вы могли бы сделать это:

# Bigger data for example 
set.seed(123) 
x <- matrix(sample(c(NA,1:5) , 50 , TRUE) , 5) 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
#[1,] 1 NA 5 5 5 4 5 2 NA NA 
#[2,] 4 3 2 1 4 3 5 4 2  1 
#[3,] 2 5 4 NA 3 3 4 1 2  2 
#[4,] 5 3 3 1 5 1 4 1 2  1 
#[5,] 5 2 NA 5 3 NA NA 1 NA  5 

# Column indices 
id <- seq(1 , ncol(x) , by = 2) 
[1] 1 3 5 7 9 
apply(cbind(id,id+1) , 1 , function(i) sum(complete.cases(x[,c(i)]))) 
[1] 4 3 4 4 3 

complete.cases() работает по всей шкале в целом data.frame или matrix возвращение TRUE для тех строк, которые не пропускают никаких данных. Недостаток в стороне: "c" - плохое имя переменной, потому что c() является одной из наиболее часто используемых функций.

+2

'x' представляется матрицей в исходном сообщении, но это не имеет значения для решения. – Roland

+0

Hi Simon, совершенно. Как я уже сказал, мне нужно сделать это над большой матрицей, по два ряда за каждый, давая мне одно целое число, но моя проблема в том, что он возвращает матрицу. –

+0

@Roland благодарит за место. Я обновил. Приветствия. –

0

Это shoudl работы как для matrix и data.frame

> sum(apply(c, 1, function(x)all(!is.na(x)))) 

[1] 2 

и вы можете просто перебирать большую матрицу M

for (i in 1:(ncol(M)-1)){ 
    c <- M[,c(i,i+1] 
    agreement <- sum(apply(c, 1, function(x)all(!is.na(x)))) 
} 
Смежные вопросы