2016-07-20 38 views
0

パッケージまたは他のパッケージを使用して、を除いて、IDを除いた完全な観測数を表示しようとしています。はNA以外の値を数え、変数でグループ化する

NA値を除外するのにna.omitを使用すると、完全にゼロになる可能性のあるすべてのIDが失われます。最後に

、私は2つの列を持つ周波数テーブルたい:私は私自身の機能z作成しようとするとIDNumber of Complete Observations

> length(unique(data$ID)) 
[1] 332 

> head(data) 
    ID value 
1 1 NA 
2 1 NA 
3 1 NA 
4 1 NA 
5 1 NA 
6 1 NA 

> dim(data) 
[1] 772087  2 

を - 非NA値をカウントしてのそれを適用するにはaggregate()機能では、完全な観測値がゼロのIDは除外されます。 323ではなく332の行を残す必要があります。これは基本関数を使ってどのように解決しますか?これを行う方法の

z <- function(x){ 
    sum(!is.na(x)) 
} 

aggregate(value ~ ID, data = data , FUN = "z") 

> nrow(aggregate(isna ~ ID, data = data , FUN = "z")) 
[1] 323 
+0

データをdput()できますか? – mkt

+0

すてきな解決策ではありませんが、すべてのNA値を 'value'変数にはない数値(たとえば0または9999999)に設定することができます。その行にその番号がない観測数を数えます。それらの数字をすべてNAに戻します。 – Marcel10

+1

'complete.cases'はパッケージではない関数です – Sotos

答えて

2

一つはtableを使用している:

df2 <- table(df$Id, !is.na(df$value))[,2] 
data.frame(ID = names(df2), value = df2) 

データを

structure(list(Id = c(1, 1, 1, 2, 2, 3, 3, 3, 3, 3, 4, 4), value = c(NA, 
1, 1, 2, 2, NA, 3, NA, 3, 3, 4, 4)), .Names = c("Id", "value" 
), row.names = c(NA, -12L), class = "data.frame") 
1

ベースRをあなたはこのようなあなたのユーティリティ関数を使用することができます。

stack(by(data$value, data$ID, FUN=function(x) sum(!is.na(x)))) 
0

この目的のためにテーブルを直接使用することができます。以下にサンプルコードを示します。

df1 <- structure(list(Id = c(1, 1, 1, 2, 2, 3, 3, 3, 3, 3, 4, 4), value = c(2, 
1, 1, NA, NA, NA, 3, NA, 3, 3, 4, 4)), .Names = c("Id", "value" 
), row.names = c(NA, -12L), class = "data.frame") 


df2 <- as.data.frame.matrix(with(df1, table(Id, value))) 
resultDf <- data.frame(Id=row.names(df2), count=apply(df2, 1, sum)) 
resultDf 

コードはIDと値のテーブルを作成します。次に、テーブルからの非na値を合計します。これが理解しやすく、助けてくれることを願っています。

関連する問題