[R]

2011-03-19 8 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 

: 그것은 의도적으로 내 데이터베이스, 나는 거대한 데이터베이스와 사람을 성가 시게 기꺼이하지 않다, 내 진짜 '안양'dataframe 다시 실제로 훨씬 더 큰,이 간단한 보이는 ... 그래서 그 수는 'b'에서 'e'까지의 열에서 발생하지만 동시에 'id'열의 id 번호에 의해 'groupped'되어야한다는 사실을 고려할 때. 그것은, 그것을 확인 잘 작동 ->

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를 수집 할 경우 내 데이터 프레임 여기 저기 어떤 NA 값이 포함되어 있으면 무엇? 그렇다면이 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 

:

다음은 NAS가 내 수정 된 데이터 프레임이다, 내가 한 유일한 것은 내가이 적용하려한다는

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

했다 exclude=NULL 건.

최소한 내 코드는 열 a(1,2,3,NA)에 4 개의 다른 레벨을 가지고 있으며 세 가지가 아니라 (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 

을 말한다3210

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

사람이 어떻게 "설득"하는 기능 도표로하여 NAS를 계산하는 어떤 아이디어가 있습니까? 전혀 가능합니까? 즐거운 주말

정말 감사하고 있고,

라즐로

+0

-1 또한 r-help –

+0

@G에 게시되었습니다. Grothendieck --- Gabor, 투표 시스템 IMHO의 부적절한 사용입니다. 투표 메커니즘은 유용한 Q 또는 명확한 Q 대 유용하지 않거나 불분명 한 Q를 식별하는 것을 목표로합니다. 그래서 Q가 여기에 게시되어 있다면 여기에 R-Help의 별도 엔티티가 필요합니다. @Laszlo가 그의 Q와 함께 몇몇 SE 사이트를 스팸 한 것 같지 않다. –

+0

또한 "진짜 Q가 아님"으로 결론을 내린 사람은 누구이며, 어떻게 그 의견을 얻습니까? 지나치게 노골적인 코드가 전달되면 Q는 합리적으로 명확합니다. @ 라즐로는 다른 수준의 요인뿐만 아니라 'NA'도 계산하려고합니다. –

답변

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 인수를 사용합니다. NAdf 사용하여, 우리는이 : NA가있는 경우 우리는 테이블 NA을 요구하기 때문에

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 

은하지 tabs의 모든 테이블이 동일한 수의 열이 있습니다. - 우리가 addNA()를 사용

> 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 

마지막으로 또한 우리가 원하는 것을 가져옵니다 그 중요하다면, 우리는 useNA = "always"useNA = "ifany"을 변경할 수 있습니다 모든 결과 테이블이 동일한 수의 열이있을 것이다, 그러나 그것은 또 다른 ID 행을 추가합니다 기록에는 NA의가없는 경우에도, 숫자의 집합 각 id 년대에 NA 수준을 추가하는 :

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는 왜 그들이 대답을 왜곡했는지 설명해 줄 것입니까? –

+0

나는 누가 내가 왜 그런지 알고 있다고 생각한다 - 나의 의심이 옳다면, downvote는 투표 시스템의 또 다른 오용 (남용)이다. –

0

당신은 is.na를 사용할 수 있습니까? NA 또는 0이 아닌 항목 수를 계산하려면 sum(is.na(my.var)|my.var>0) 수 있습니다.