2016-08-21 2 views
0

아래와 같이 데이터 구조의 예를 만들었습니다.R - Transforming DataFrame

문제 1 : "시작일"은 실제로 $ start와 $ end의 차이이지만 실제로 측정 일수는 반영되지 않았습니다. 그래서 $ id의 각 ID마다 카운터가 필요합니다. 따라서 id = 2는 "4"대신 "2"일 값을 가져야합니다.

솔루션 :

Count <- rle(sort(activity$id)) 
activity$count <- Count[[1]][match(activity$id, Count[[2]])] 

문제 2 : 그 후, 우리가 가지고 있지 않은 모든 측정은 정확하게 측정 사일은 삭제해야합니다. 이 경우, id 2와 4는 각각 2와 3 개의 데이터 포인트만을 가지므로 id 1,3,5와 6은 생존 할 것입니다.

솔루션 :

activity <- subset(activity, count== 30) 

문제 3 : 나는 $ 상태에서 "완료"로 표시되는 경우를 필터링 할 필요가있다. 여기서 모든 조정이 끝나면 ID 1,3 및 6 만 생존 할 것입니다.

R의 각 단계는 어떻게 생겼습니까?

id status energy sun start  end   days 
1 ok  10  10 01/05/16 01/09/16 4 
1 ok  20  20 01/05/16 01/09/16 4 
1 ok  30  30 01/05/16 01/09/16 4 
1 finished 40  40 01/05/16 01/09/16 4 
2 ok  0  5 12/06/15 12/10/15 4 
2 failed 0  5 12/06/15 12/10/15 4 
3 ok  10  5 12/26/15 12/30/15 4 
3 ok  20  10 12/26/15 12/30/15 4 
3 ok  30  15 12/26/15 12/30/15 4 
3 finished 40  20 12/26/15 12/30/15 4 
4 ok  10  0 07/09/15 07/12/15 3 
4 ok  15  10 07/09/15 07/12/15 3 
4 failed 5  10 07/09/15 07/12/15 3 
5 ok  10  5 11/16/15 11/20/15 4 
5 ok  12  10 11/16/15 11/20/15 4 
5 ok  18  15 11/16/15 11/20/15 4 
5 failed 20  20 11/16/15 11/20/15 4 
6 ok  10  20 12/31/15 01/04/16 4 
6 ok  20  30 12/31/15 01/04/16 4 
6 ok  30  35 12/31/15 01/04/16 4 
6 finished 40  45 12/31/15 01/04/16 4 
+4

여러 질문이 아닌 게시물에 하나의 질문을하는 것이 좋습니다 : d를 가정하면 데이터입니다. – akrun

+1

지금까지 시도한 것은 무엇입니까? – agstudy

+0

솔루션에 공통적 인 기능이있을 것으로 생각했습니다. 그래서 내가 그 한 가지 경우에 충실합니다. – JohnnyDeer

답변

1

당신은 (귀하의 경우, id에) 요인에 의해 dataframe 분할에 기능을 적용 할. base R에서 by() 및 관련 기능 tapply()이 필요합니다.

d$days <- tapply(d$id, d$id, length)[d$id] 
d <- subset(d, days == 4) 
d <- do.call(rbind, 
    by(d, d$id, function(x) if ("finished" %in% x$status) x else NULL) 
)