2013-07-17 2 views
0

샘플 데이터. 코드 블록 시스템을 사용하는 방법은 아직 잘 모르겠습니다.R 서브 세트 데이터 프레임 및 컬럼을 기초로 기능 수행

df <- data.frame(c(1,1,1,2,2,2,3,3,3),c(1990,1991,1992,1990,1991,1992,1990,1991,1992),c(1,2,3,3,2,1,2,1,3)) 
colnames(df) <- c("id", "year", "value") 

간단한 매트릭스를 생성합니다.

id year value
1 1990 1
1 1991 2
1 1992 3
2 1990 3
2 1991 2
2 1992 1
3 1990 2
3 1991 1
3 1992 3

I는 R의 부분 집합의 질문을 통해 분류하고, 그것에인가되는 ddply 함수 {} plyr 두 번째 단계를 알아낼 수있다.

논리 : 모든 ID 하위 그룹에 대해 가장 빠른 시간에 가장 높은 값 (3)을 찾습니다.

여기서 어떤 구문을 사용하는지 혼란 스럽습니다. SO 검색에서 ddply가 최선의 선택이라고 생각하지만 방법을 파악할 수는 없습니다. 이상적으로, 내 출력은 UNIQUE ID의 벡터 여야합니다 (단 하나가 선택되고 전체 행이 함께 선택됨). 이는 R에서는 작동하지 않지만 최상의 "논리"를 얻을 수 있습니다.

3 사용할 수없는 경우

ddply((ddply(df,id)), year, which.min(value))

는 예

id year value
1 1992 3
2 1990 3
3 1992 3

, 어떤 아이디어. 다음 (2, 1) 가장주의해야한다?

답변

2

당신은 ddply를 이해하는 것이 필요분할 변수에 따라 원본 data.frame을 data.frames로 분할합니다. 따라서 인수와 반환 값으로 data.frame을 가진 함수가 필요합니다. 내가 data.table 생각

library(plyr) 
ddply(df,.(id),function(DF) {res <- DF[which.max(DF$value),] 
          res[which.min(res$year),]}) 

# id year value 
# 1 1 1992  3 
# 2 2 1990  3 
# 3 3 1992  3 
+0

감사합니다! 나는 R에 아직 많은 기능을 작성하지 않았으므로 그것이 내가 잡힌 곳이다. 만약 내가 그것을 이해한다면, ddply 함수 문장으로 조작 할 수있는 데이터 프레임을 생성한다. – ashah57

+0

정확히,'ddply'는 함수로 전달되는 data.frames로 나눕니다. 이 함수는 data.frames를'ddply'에 반환하고, 다시'ddply'를 반환합니다. – Roland

+0

당신이 지금 네 번 썼던이 기능으로 돌아 왔습니다. 이것은 완벽했습니다, 롤랜드. – ashah57

0

는 (모두 속도와 구문 이유)에 가장 적합한 도구입니다

library(data.table) 
dt = data.table(df) 

# order by year, and then take the first row for each id that has max 'value' 
dt[order(year), .SD[which.max(value)], by = id] 
# id year value 
#1: 1 1992  3 
#2: 2 1990  3 
#3: 3 1992  3 

# if you're after speed, this slightly worse syntax is the current way of achieving it 
dt[dt[order(year), .I[which.max(value)], by = id]$V1] 
+0

이것은 Roland가 결과의 측면에서 게시 한 것과 일치하는 것으로 보입니다. 에드디 감사합니다. – ashah57

관련 문제