R Summe vollständiger Fälle zweier Spalten
Frage
Wie kann ich die Anzahl der vollständigen Fälle zweier Spalten summieren?
Mit c
gleich:
a b
[1,] NA NA
[2,] 1 1
[3,] 1 1
[4,] NA 1
Etwas anwenden wie
rollapply(c, 2, function(x) sum(complete.cases(x)),fill=NA)
Ich möchte eine einzelne Nummer zurückbekommen, 2
in diesem Fall.Dies gilt für einen großen Datensatz mit vielen Spalten, den ich daher gerne verwenden würde rollapply
über das gesamte Set, anstatt es einfach zu tun sum(complete.cases(a,b))
.
Denke ich darüber nach?
Danke!
Lösung
Die Anzahl der vollständigen Fälle in benachbarten Matrixspalten können Sie mit berechnen rollapply
so was:
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
Andere Tipps
Hast du versucht 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
Um das zu finden complete.cases()
der ersten beiden Spalten:
sum(complete.cases(x[,1:2]))
#[1] 4
Und dazu apply
auf zwei Spalten von a matrix
Über die gesamte Matrix hinweg könnten Sie Folgendes tun:
# 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()
wirkt zeilenweise über das Ganze data.frame
oder matrix
zurückkehren TRUE
für die Zeilen, in denen keine Daten fehlen.Eine kleine Ausnahme, "c"
ist ein schlechter Variablenname, weil c()
ist eine der am häufigsten verwendeten Funktionen.
Das sollte für beide funktionieren matrix
Und data.frame
> sum(apply(c, 1, function(x)all(!is.na(x))))
[1] 2
und Sie könnten einfach eine große Matrix durchlaufen 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))))
}