2017-01-17 1 views
7

입니다. 여러 프로젝트에 대한 데이터가 있습니다. 각 프로젝트는 개별 팀으로 구성되어 있습니다. 나는 R가 가장 높은 팀의 순위와 그 사람의 성별에 새로운 변수를 만들려면, 각 프로젝트에 대한벡터의 가장 높은 값과 관련 열의 문자열이 모두 R

df <- read.table(header = TRUE, text = 'Project GenderA RankA GenderB RankB GenderC RankC 
      100 1 3 0 1 1 2 
      200 1 2 1 2 NA NA 
      300 0 3 1 3 0 2 
      400 0 1 NA NA NA NA 
      500 1 1 0 2 1 1') 

: 그래서처럼, 자신의 계급과 성별에 대한 정보를 가지고있다.

df<-cbind(df, 
    HighRank = pmax(df$RankA, df$RankB, df$RankC)) 

을하지만 (즉없이 NAS가있다) 만 완료 프로젝트에 작동하고, 성별 컬럼과 연관되지 않은 :

Project GenderA RankA GenderB RankB GenderC RankC HighGen HighRank 
    100  1  3  0  1  1  2  1  3 

나는 PMAX로 가장 높은 순위를 얻을 수 있습니다. 둘 다 할 수있는 가장 좋은 방법은 무엇입니까?

+1

어떻게 넥타이를 다루고 싶습니까? – ulfelder

답변

9

이것은 유쾌한 답변이지만 한 번에 해결하기 어려운 이유는 데이터가 깔끔하지 않기 때문입니다. 이 경우 각 행마다 하나의 관찰을 원하게됩니다. 종류의 모든 순위에 의해 해당 프로젝트의 점수, 다음 마지막으로 첫 번째 필터링하고, 프로젝트에 의해 당신에게, 그룹을

library(dplyr) 

df <- read.table(header = TRUE, text = 'Project Gender Rank order 
      100 1 3 A 
      100 0 1 B 
      100 1 2 C 
      200 1 2 A 
      200 1 2 B 
      200 NA NA C 
      300 0 3 A 
      300 1 3 B 
      300 0 2 C') 

df %>% group_by(Project) %>% arrange(-Rank) %>% slice(1) %>% ungroup() 

그 마지막 줄을 설명하기 위해 : 나는 '깔끔한'표현과 dplyr 패키지를 사용하는 솔루션을 제공 , 좋은 측정을 위해, 당신은 그룹화를 잊는다는 것을 의미합니다. 결과는 점수, 성별을 포함하여 각 프로젝트의 최고 점수 기록입니다. 또한 'rankA'또는 'rankB'등으로 데이터가 채점되었다는 사실을 반영하기 위해 새로운 변수 'order'를 넣었습니다.

아웃 :

| Project| Gender| Rank|order | 
|-------:|------:|----:|:-----| 
|  100|  1| 3|A  | 
|  300|  0| 3|A  | 
|  200|  1| 2|A  | 

단정 한 표현으로 데이터를 분리도 수행 할 수 있습니다,하지만 당신은 당신이 처음에 데이터를 입력 한 방법을 살펴 할 수 있습니다. 그것은 정돈을위한 것입니다, 그러나 광범위한 독서를 위해 당신은 http://vita.had.co.nz/papers/tidy-data.pdf을 볼 수 있습니다.

| Project|order | Gender| Rank| 
|-------:|:-----|------:|----:| 
|  100|A  |  1| 3| 
|  100|B  |  0| 1| 
|  100|C  |  1| 2| 
|  200|A  |  1| 2| 
|  200|B  |  1| 2| 
|  200|C  |  NA| NA| 
|  300|A  |  0| 3| 
|  300|B  |  1| 3| 
|  300|C  |  0| 2| 
|  400|A  |  0| 1| 
|  400|B  |  NA| NA| 
|  400|C  |  NA| NA| 
|  500|A  |  1| 1| 
|  500|B  |  0| 2| 
|  500|C  |  1| 1| 

그런 다음 먹을 수 : 그레고르의 의견에

감사합니다, 여기

library(tidyr) 


df <- read.table(header = TRUE, text = 'Project GenderA RankA GenderB RankB GenderC RankC 
      100 1 3 0 1 1 2 
      200 1 2 1 2 NA NA 
      300 0 3 1 3 0 2 
      400 0 1 NA NA NA NA 
      500 1 1 0 2 1 1') 

df %>% gather(key = key, value = value, -Project) %>% separate(key, into = c("variable", "order"), sep = -2) %>% spread(key = variable, value = value) 

아웃 (패키지 tidyr를 사용하여) 더 단정 한 표현으로 dataframe를 변환하는 방법은 이 첫 번째 부분에서 수식을 귀하의 솔루션을 얻을 수 있습니다.

+5

나는 기본적으로 이것에 대한 대답을하고 있었다. 'dplyr'와'tidyr'를 사용하여 데이터 정리를위한 코드 : op_df %> collect (key = key, value = value, -Project) %> % separate (key, into = c ("variable", "order"), sep = -2) %> % spread (key = 변수, value = 값)'. 이 질문을 귀하의 질문에 자유롭게 편집하십시오. – Gregor

관련 문제