2016-10-12 2 views
6

여기에 재현 가능한 데이터 예제가 있습니다. 다음 데이터 프레임의 경우 : 내가 시도다른 열의 순위에 따라 R의 데이터 프레임에 열을 추가하십시오.

Subject SNR Rank 
John  -4 1 
John  -4 1 
John  0 2 
John  4 3 
Mary  0 1 
Mary  4 2 
Mary  4 2 
Mary  8 3 

:

df <- data.frame(Subject = c('John', 'John', 'John', 'John','Mary', 'Mary', 'Mary', 'Mary'), 
       SNR = c(-4,-4,0,4,0,4,4,8)) 

나는 열은 다음과 같을 것이다 그래야, 주제에 의한 SNR에 대한 순위를 제공하는 '순위'를 추가하고 싶습니다 사용 :

dfNew <- transform(df, Rank = ave(SNR, Subject, FUN = function(x) rank(x, ties.method = "first"))) 

하지만 내가 얻을 다음

Subject SNR Rank 
John  -4 1 
John  -4 2 
John  0 3 
John  4 4 
Mary  0 1 
Mary  4 2 
Mary  4 3 
Mary  8 4 

다른 ties.method 옵션을 사용해 보았지만 찾고있는 것을 제공하지 못했습니다 (즉, 1-3의 순위 만).

은 어떤 도움이 많이 주시면 감사하겠습니다!

+4

'dplyr :: dense_rank'을 사용해보세요. 또는 패키지를 사용하지 않으려는 경우에만 코드를 사용하십시오. 기본 R 코드의 두 줄 밖에 없습니다. –

+2

'function (x) as.numeric (factor (x))'가 당신의 시도에서 작동 할 것입니다. 또는 ave가'SNR'의 유형으로 되돌아 가게 될 것이기 때문에'factor (x)'만 사용하십시오. – rawr

+0

트릭을 해주신 @rawr, 고마워요. – Rmg

답변

2

을 언급 위해 :

ag <- aggregate(SNR~Subject, df, function(x) as.numeric(factor(x))) 
df$rank <- c(t(ag[,-1])) 

    Subject SNR rank 
1 John -4 1 
2 John -4 1 
3 John 0 2 
4 John 4 3 
5 Mary 0 1 
6 Mary 4 2 
7 Mary 4 2 
8 Mary 8 3 
1

A는 더티 비트 그러나 작동하는 것 같다 : 학점의

library(dplyr) 
df %>% group_by(Subject) %>% mutate(Rank = as.numeric(as.factor(SNR))) 

    Subject SNR Rank 
    <fctr> <dbl> <dbl> 
1 John -4  1 
2 John -4  1 
3 John  0  2 
4 John  4  3 
5 Mary  0  1 
6 Mary  4  2 
7 Mary  4  2 
8 Mary  8  3 
+0

Downvote,이 잘못 된가요? – Haboryme

+0

내 표가 아니지만 실제로 열을 추가하기 위해 패키지를로드 할 필요가 없기 때문에 추측하고 있습니다. –

+0

정기적으로 사용하지 않는다면 dplyr을로드해야합니다. as.numeric (as.factor()) 때문일 수 있습니다. – infominer

1
library(dplyr)  
df %>% 
    arrange(Subject, SNR) %>% 
    group_by(Subject) %>% 
    mutate(rank=dense_rank(SNR)) 

을 @ 풍부한 Scriven에에 기본 R에 aggregatefactor를 사용 dense_rank()

2

다른 기본 R 방법 :

transform(df1, Rank = ave(SNR, Subject, FUN = function(x) cumsum(c(TRUE, head(x, -1) != tail(x, -1))))) 

준다 : 당신의 dataframe 아직 주문하지 않은 경우

Subject SNR Rank 
1 John -4 1 
2 John -4 1 
3 John 0 2 
4 John 4 3 
5 Mary 0 1 
6 Mary 4 2 
7 Mary 4 2 
8 Mary 8 3 

, 정확한 결과를 제공하기 위해이 방법을 먼저 df1 <- df1[order(df1$SNR),]와 그것을 주문해야합니다.

관련 문제