2016-11-17 51 views
1

每個變量99`s和NA`s我有118個變量與0's1's99'sNA's的數據幀。我需要計算每個變量有多少99'sNA's1's0's(該99是「不適用」,則0是「否」,則1是「是」,而NA是「無應答」)。我試圖用table函數來做到這一點,但它與向量一起工作,我怎樣才能完成所有變量集?計數0`s,1`s,用於在數據幀

有數據幀有點重複的例子:

forest<-c(1,1,1,1,0,0,0,1,1,1,0,NA,0,NA,0,99,99,1,0,NA) 
water<-c(1,NA,NA,NA,NA,99,99,0,0,0,1,1,1,0,0,NA,NA,99,1,0) 
rain<-c(1,NA,1,0,1,99,99,0,1,0,1,0,1,0,0,NA,99,99,1,1) 
fire<-c(1,0,0,0,1,99,99,NA,NA,NA,1,0,1,0,0,NA,99,99,1,1) 

df<-data.frame(forest,water,rain,fire) 

而且我需要在一個數據幀寫結果的變量,就像這樣:

forest water rain fire 
1 8   5  8  6 
0 7   6  6  6 
99 2   3  4  4 
NA 3   6  2  4 
+1

'lapply(df,table)'。或** sapply(df,table)'** s **輸出而不是列表。 – Gregor

回答

2

不能找到一個很好的欺騙,所以這裏是我的評論作爲答案:

數據框實際上是列的列表。 lapply將適用的功能在輸入(每一列,在數據幀的情況下)的每一項,並與每一個結果返回一個列表:

lapply(df, table) 
# $forest 
# 
# 0 1 99 
# 7 8 2 
# 
# $water 
# 
# 0 1 99 
# 6 5 3 
# 
# $rain 
# 
# 0 1 99 
# 6 8 4 
# 
# $fire 
# 
# 0 1 99 
# 6 6 4 

sapply就像lapply,但它會嘗試小號暗示結果,而不是總是返回list。在這兩種情況下,你可以沿着額外的參數傳遞給函數被應用,如useNA = "always"table有包含在輸出NA

sapply(df, table, useNA = "always") 
#  forest water rain fire 
# 0   7  6 6 6 
# 1   8  5 8 6 
# 99  2  3 4 4 
# <NA>  3  6 2 4 

對於很多更多信息,請R Grouping functions: sapply vs. lapply vs. apply. vs. tapply vs. by vs. aggregate


與其他一些答案進行比較:applylapplysapply類似,但是它打算用於矩陣或更高維的數組。您唯一應該在data.frame上使用apply是當您需要將函數應用於每行時。對於數據幀列上的功能,更喜歡lapplysapply。原因是apply首先會將數據幀強制爲matrix,如果您有不同類別的列,可能會產生意想不到的後果。

1

這應該這樣做:

tables <- apply(df, 2, FUN = table) 
2
rbind(sapply(df,table),"NA"=sapply(df, function(y) sum(is.na(y)))) 
    forest water rain fire 
0  7  6 6 6 
1  8  5 8 6 
99  2  3 4 4 
NA  3  6 2 4 
1

釷這可能是一舉成功的方法。

申請(DF,2,表)

申請(DF,2,函數(X){總和(is.na(X))})

1

由於變量因素,你應該首先將它們變成它:

df <- lapply(df, as.factor) 

然後,總結你的data.frame

sapply(df, summary) 

summary()功能係數法計算的每個級別它。

相關問題