【问题标题】:R Sum complete cases of two columnsR总结两列的完整案例
【发布时间】:2014-01-10 09:14:22
【问题描述】:

如何将两列的完整案例数相加?

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))

我是不是想多了?

谢谢!

【问题讨论】:

  • rollapply 属于哪个包?而且我不明白为什么 sum( complete.cases( c ) ) 不应该是解决您问题的最佳代码。

标签: r matrix sum apply rollapply


【解决方案1】:

你试过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.framematrix 中按行工作,为那些没有丢失任何数据的行返回TRUE。除了一个小问题,"c" 是一个糟糕的变量名,因为c() 是最常用的函数之一。

【讨论】:

  • x 在原始帖子中似乎是一个矩阵,但这对于解决方案并不重要。
  • 嗨,西蒙,绝对是。正如我所说,我需要在一个大矩阵上执行此操作,一次两行,每行返回一个整数,但我的问题是它返回一个矩阵。
  • @Ubobo 检查底部的编辑。只需将矩阵子集到您想要的列。
  • @Ubobo 你想成对计算完整的案例吗?你的意思是成对的列或行?请您澄清一下您的问题。
【解决方案2】:

您可以使用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

【讨论】:

  • 谢谢,这就是我要找的!
【解决方案3】:

这应该适用于matrixdata.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))))
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多