2016-12-30 6 views
0

Lassen Sie uns sagen, dass ein Datenrahmen vier Spalten enthältEinige Zusammenfassung Stat für jede Spalte in DF in R

set.seed(123) 
x1 <- runif(10,0,1) 
x2 <- runif(10,0,1) 
x3 <- runif(10,0,1) 
x4 <- runif(10,0,1) 
DF <- data.frame(x1,x2,x3,x4) 

Für jede Spalte, möchte ich die Anzahl der Beobachtungen berechnen, die kleiner als oder gleich 0,5 ist. Hier ist mein Code, aber es scheint nicht zu funktionieren:

a <- vector() 
pvect1 <- vector() 

for (j in 1:ncol(DF)) 
{ 
    for (i in 1:nrow(DF)) 
    { 

    if (DF[i,j] <= 0.5) 
     a[i]=1 
    else 
     a[i]=0 

    pvect1[j] <- cumsum(a[i])  

    } 
} 

Abschließend möchte ich einen neuen Datenrahmen erstellen (nennen wir es DF2), die zwei Spalte (C1 und C2), wobei C1 die ist Spaltenname in DF (x1, x2, x3 und x4) und C2 ist die Anzahl der Beobachtungen, die für jede Spalte in DF kleiner oder gleich 0,5 sind.

Antwort

2

Wir colSums auf einem logischen matrix tun können, um die Anzahl der TRUE-Elemente in jeder Spalte

v1 <- colSums(DF <= 0.5) 

Für die Schaffung eines data.frame, zu finden

DF2 <- data.frame(C1 = names(v1), C2 = v1, stringsAsFactors=FALSE) 

Wenn wir wirklich verwenden müssen for loops

a <- vector() #it is better to pre-allocate the size 
pvect1 <- vector() #same comment as above 

for (j in 1:ncol(DF)) { 
    for (i in 1:nrow(DF)) { 

    if (DF[i,j] <= 0.5) { 
     a[i]=1 
     } else { 
      a[i]=0 
     } 

    } 
    pvect1[j] <- sum(a) 
}  

mit der vektorisiert Lösung prüfen

identical(as.vector(v1), pvect1) 
#[1] TRUE 
+0

Dank. Das ist eine nette Lösung .... es hat mich wie ein Idiot aussehen lassen. – user9292

+0

@ user9292 Ich bin froh, Ihnen zu helfen. Es ist nur so, dass du nicht an "colSums" gedacht hast. Es passiert mir oft .. – akrun

+0

Auf eine Randnotiz können Sie bitte, wenn möglich, darauf hinweisen, warum mein Code nicht funktioniert. Vielen Dank. – user9292

Verwandte Themen