2016-12-30 33 views
0

在DF每一列的一些彙總統計比方說,一個數據幀包含四列爲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) 

對於每一列,我想計算出小於或等於0.5的觀測次數。這裏是我的代碼,但它似乎並不奏效:

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

    } 
} 

最後,我想創建一個包含兩個列(C1和C2)的新數據框(我們稱之爲DF2),其中C1爲DF(x1,x2,x3和x4)中的列名稱,C2是DF中每列小於或等於0.5的觀察值數目。

回答

2

我們可以做colSums在邏輯matrix找到每一列

v1 <- colSums(DF <= 0.5) 

TRUE元素的個數有關創建data.frame

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

如果我們真的需要使用for環路

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

與矢量化溶液

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

由於檢查。這是一個很好的解決方案....它讓我看起來像個傻瓜。 – user9292

+0

@ user9292很高興爲您效勞。只是你沒有考慮'colSums'。它發生在我身上很多次.. – akrun

+0

在附註中,如果可能請指出爲什麼我的代碼不起作用。謝謝。 – user9292