2014-01-10 24 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 

而要在整个矩阵matrixapply两列,你可以这样做:

# 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.framematrix排队工作返回TRUE用于那些不缺少任何数据的行。抛开轻微,"c"是一个不好的变量名称,因为c()是最常用的功能之一。

+2

'x'似乎是原始文章中的矩阵,但这对解决方案无关紧要。 – Roland

+0

嗨西蒙,绝对。正如我所说,我需要在一个大矩阵上做这件事,每次两行,每次给我一个整数,但是我的问题是它返回一个矩阵。 –

+0

@罗兰感谢您的光临。我更新了。干杯。 –

0

通过大型矩阵两种matrixdata.frame

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

[1] 2 

,你可以简单地重复这种shoudl工作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)))) 
}