2011-03-19 16 views
1

數據幀中統計NAs我想再次問你一個問題。它基本上是關於[R]中的數據幀,NAs和表格功能。「說服」列表功能在[R]

我有這個數據框。我以前的問題已經用過了。它故意看起來這個簡單,我真正的「東風」數據幀是更大的實際又一次,我不願騷擾與大型數據庫的人......所以,我的數據庫:

id <-c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3) 
a <-c(3,1,3,3,1,3,3,3,3,1,3,2,1,2,1,3,3,2,1,1,1,3,1,3,3,3,2,1,1,3) 
b <-c(3,2,1,1,1,1,1,1,1,1,1,2,1,3,2,1,1,1,2,1,3,1,2,2,1,3,3,2,3,2) 
c <-c(1,3,2,3,2,1,2,3,3,2,2,3,1,2,3,3,3,1,1,2,3,3,1,2,2,3,2,2,3,2) 
d <-c(3,3,3,1,3,2,2,1,2,3,2,2,2,1,3,1,2,2,3,2,3,2,3,2,1,1,1,1,1,2) 
e <-c(2,3,1,2,1,2,3,3,1,1,2,1,1,3,3,2,1,1,3,3,2,2,3,3,3,2,3,2,1,4) 
df <-data.frame(id,a,b,c,d,e) 
df 

我已成功地計算的分佈數字出現在列'b'到'e'中,但同時考慮到事實,即這些分佈應該由'id'列中的id號「分組」。它工作正常,檢查 - >

matrix(matrix(unlist(lapply(df[,(-(1))], 
     function(x) tapply(x,df$id,tabulate, 
          nbins=nlevels(factor(df[,2])))) [[1]])), 
       ncol=3,nrow=3,byrow=TRUE) 

matrix(matrix(unlist(lapply(df[,(-(1))],function(x) tapply(x,df$id,tabulate,nbins=nlevels(factor(df[,3])))) [[2]])),ncol=3,nrow=3,byrow=TRUE) 

matrix(matrix(unlist(lapply(df[,(-(1))],function(x) tapply(x,df$id,tabulate,nbins=nlevels(factor(df[,4])))) [[3]])),ncol=3,nrow=3,byrow=TRUE) 

matrix(matrix(unlist(lapply(df[,(-(1))],function(x) tapply(x,df$id,tabulate,nbins=nlevels(factor(df[,5])))) [[4]])),ncol=3,nrow=3,byrow=TRUE) 

matrix(matrix(unlist(lapply(df[,(-(1))],function(x) tapply(x,df$id,tabulate,nbins=nlevels(factor(df[,6])))) [[5]])),ncol=4,nrow=3,byrow=TRUE) 

現在我的問題是:如果我的數據幀都包含在這裏和那裏,什麼NA值,如果我想我的內置功能製表收集這些來港定居,以及什麼?那麼,如果我想讓它計算我從這些NAS獲得的事件數量呢?

下面是與NAS我修改的數據幀:

id <-c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3) 
a <-c(NA,1,3,3,1,3,3,3,3,1,3,2,1,2,1,3,3,2,1,1,1,3,1,3,3,3,2,1,1,3) 
b <-c(3,2,1,1,1,1,1,1,1,1,1,2,1,3,2,1,1,1,2,1,3,1,2,2,1,3,3,2,3,2) 
c <-c(1,3,2,3,2,1,2,3,3,2,2,3,NA,2,3,3,3,1,1,2,3,3,1,2,2,3,2,2,3,2) 
d <-c(3,3,3,1,3,2,2,1,2,3,2,2,2,1,3,1,2,2,3,2,3,2,3,2,1,1,1,1,1,2) 
e <-c(2,3,1,2,1,2,3,3,1,1,2,1,1,3,3,2,1,1,3,3,2,2,3,3,3,2,3,NA,1,4) 
df <-data.frame(id,a,b,c,d,e) 
df 

起初,我想是這樣的:

unlist(lapply(df[,(-(1))],function(x) tapply(x,df$id,tabulate,nbins=nlevels(factor(df[,2],exclude=NULL)))) [[1]]) 

你看,我做的唯一的事情是,我嘗試着將這個exclude=NULL的事。

至少我的代碼意識到我有4個不同層次的列a(1,2,3,NA)而不僅僅是三個(1,2,3)。檢查它在這裏:

nlevels(factor(df[,2], exclude=NULL)) 

但你看到在某種程度上它不能計算NA的結果。它說

3 0 6 0 4 3 3 0 4 1 5 0 

取而代之的是正確的:

3 0 6 1 4 3 3 0 4 1 5 0 

或者在情況:

unlist(lapply(df[,(-(1))],function(x) tapply(x,df$id,tabulate,nbins=nlevels(factor(df[,4],exclude=NULL)))) [[3]]) 

它說

2 4 4 0 2 3 4 0 1 5 4 0 

而不是正確

2 4 4 0 2 3 4 1 1 5 4 0 

是否有人有任何想法如何「說服」功能的平板狀算來港?它有可能嗎?

非常感謝,有一個愉快的週末,

拉茲洛

+0

-1這也發佈在r-help – 2011-03-19 15:15:33

+0

@G。格洛騰迪克---加博爾,這是一個不當使用投票系統恕我直言。投票機制旨在確定有用或清楚的Q與沒有用或不清楚的Q. SO是R-R的獨立實體如果Q在這裏和這裏發佈,爲什麼它應該重要?這不像是@Laszlo用他的問題垃圾郵件了幾個SE網站。 – 2011-03-19 15:19:37

+0

另外,誰投票結束了「不是真正的Q」,你怎麼看到這個意見?一旦你通過了超顯式代碼,Q就相當清楚了。 @拉斯洛希望要計算「NA」以及其他因素水平。 – 2011-03-19 15:21:13

回答

6

您可以簡化您的一再呼籲:

tabs <-lapply(df[,2:6], function(x, id){ t(table(x, id)) }, df$id) 

這給幾乎相同的重複矩陣通話,例如你的第一個(非NA)之一:

> tabs[[1]] 
    x 
id 1 2 3 
    1 3 0 7 
    2 4 3 3 
    3 4 1 5 

所以我們可以現在修改這個處理NA?是的,使用table()函數的useNA參數。使用您的dfNA,我們有:

tabs <-lapply(df[,2:6], 
       function(x, id){ t(table(x, id, useNA = "ifany")) }, df$id) 

> tabs[[1]] 
    x 
id 1 2 3 <NA> 
    1 3 0 6 1 
    2 4 3 3 0 
    3 4 1 5 0 

由於我們在表要求NA如果NA存在,而不是在tabs所有的表都具有相同數量的列。如果這是很重要的,我們可以改變useNA = "ifany"useNA = "always",所有的結果表將具有相同的列數,但它增加了一個ID行:

> tabs[[1]] 
     x 
id  1 2 3 <NA> 
    1 3 0 6 1 
    2 4 3 3 0 
    3 4 1 5 0 
    <NA> 0 0 0 0 

最後一個除了得到我們想要的東西 - 我們使用addNA()NA級別添加設置號碼中的各個id的,即使有記錄沒有NA S:

tabs <-lapply(df[,2:6], 
       function(x, id){ t(table(addNA(x), id, useNA = "ifany")) }, df$id) 

其中給出:

> tabs 
$a 

id 1 2 3 <NA> 
    1 3 0 6 1 
    2 4 3 3 0 
    3 4 1 5 0 

$b 

id 1 2 3 <NA> 
    1 8 1 1 0 
    2 6 3 1 0 
    3 2 4 4 0 

$c 

id 1 2 3 <NA> 
    1 2 4 4 0 
    2 2 3 4 1 
    3 1 5 4 0 

$d 

id 1 2 3 <NA> 
    1 2 3 5 0 
    2 2 6 2 0 
    3 5 3 2 0 

$e 

id 1 2 3 4 <NA> 
    1 4 3 3 0 0 
    2 4 2 4 0 0 
    3 1 3 4 1 1 
+0

downvoter會照顧解釋爲什麼他們低估了答案? – 2011-03-19 15:49:05

+0

我想我知道誰和爲什麼 - 如果我的懷疑是正確的,downvote是恕我直言,另一種濫用(濫用)投票系統。 – 2011-03-19 15:51:51

0

你就不能使用is.na?如果要計算NA或非零的條目數,則可以使用sum(is.na(my.var)|my.var>0)