2016-07-11 2 views
1

다음을 올바르게 수행하는 방법에 대해서는 상당히 당황 스럽습니다. 나는 아마 그것이 단순하다는 것을 알고있다. 그러나 나는 그것을 아주 이해할 수 없다.dplyr을 사용하여 최대 값 이전의 모든 값을 필터링하십시오.

물 속으로 들어 올려지고 내려간 계기로 데이터를 수집했다고합니다. 데이터에 상관없이 깊이를 읽습니다. 전 단지 의 데이터에 관심이 있고 모든 데이터를 필터링하고 싶습니다. 더 명확하게 나는 depth의 가장 낮은 값 인 앞에 깊이 판독 값 을 걸러 내고 싶습니다. 한 가지 작은 점은 종종 데이터가 가장 깊은 지점까지 계속하기 전에 약간 올라간 두 개의 깊이 값이 있다는 것입니다. 따라서 순수한 오름차순/내림차순 문제는 아닙니다. 이상적으로 dplyr 접근 방식 (또는 dplyr과 잘 작동하는 방식)을 사용합니다. 데이터에 그룹이 있기 때문입니다.

library(dplyr) 

df1 <- data.frame(depth=c(1:6,5,7:10,10.5:1), x=rnorm(21), Group="x") 
df2 <- data.frame(depth=c(1:6,5,7:10,10.5:1), x=rnorm(21), Group="y") 
df <- rbind(df1, df2) 

내가 가장 깊은 가치를 찾을 쉽게 할 수 이대로가 붙어 점점 계속 : 여기에 몇 가지 더미 데이터는

df %>% mutate(depth==max(depth)) 
나는 또한 하나 개의 그룹에 대한 깊이 (마크의 대답 @ 사용) 찾을 수

: 나는 group_by 문을 추가하려고 할 때

df %>% 
    filter(Group=="x") %>% 
    add_rownames() %>% 
    filter(rowname %in% c(seq(which.max(depth)))) 

그러나, 나는 여전히 첫 번째 그룹에서 원하는 결과를 얻을 :

df %>% 
    add_rownames() %>% 
    group_by(Group) %>% 
    filter(rowname %in% c(seq(which.max(depth)))) 

group_by은 필터에서 작동하지 않을 것이라고 예상했지만 필터를 사용하지 않고 rownames를 서브하는 방법을 모르겠습니다. 어떤 아이디어가 있습니까?

+0

@Psidom - 제가 위에서 말했듯이, 그것이 내가 일치 할 필요는 상승/하강 패턴이 엄격하지 않다. – boshek

+0

@ Marc의 답변으로 필요한 것을 얻을 수 있습니까? – Psidom

+0

@Psidom 정확하지 않습니다. 나는 이것을'dplyr'와 같은 방식으로 적용하는 방법을 알지 못했습니다. – boshek

답변

1

이 문제에 대한 dplyr 해결책을 마련하지 않는 것,하지만 data.table 대안이 작동합니다

library(data.table) 
setDT(df)[, head(.SD, which.max(depth)), by = Group] 
# say the factor is some grouping variable you are trying to apply 

    Group depth   x 
1:  x 1.0 -0.22907469 
2:  x 2.0 0.15284187 
3:  x 3.0 1.99289070 
4:  x 4.0 -0.80802497 
5:  x 5.0 0.41455226 
6:  x 6.0 0.39673474 
7:  x 5.0 -0.35179347 
8:  x 7.0 -0.18892176 
9:  x 8.0 2.97448709 
10:  x 9.0 -0.14464747 
11:  x 10.0 0.99434061 
12:  x 10.5 -0.64831649 
13:  y 1.0 1.10262757 
14:  y 2.0 -0.64630288 
15:  y 3.0 0.43909555 
16:  y 4.0 -0.00575027 
17:  y 5.0 -0.81374528 
18:  y 6.0 -0.45948930 
19:  y 5.0 0.03333462 
20:  y 7.0 0.31111807 
21:  y 8.0 1.64502251 
22:  y 9.0 0.97451275 
23:  y 10.0 1.12403518 
24:  y 10.5 1.21710311 
    Group depth   x 

dplyr에 집착, 당신이 만들 수는 새로운 id 변수를 사용하여 각 그룹의 행에 개별적으로 라벨을 지정하고 which.max :

을 기반으로 필터링 (210)
df %>% group_by(Group) %>% mutate(id = seq_len(n())) %>% filter(id <= which.max(depth)) 
+0

제 질문을 수정했습니다. 너와 마크 덕분에 좀 더 가까워 졌어.하지만 아직 그곳에는 꽤있다. – boshek

+1

답변에'dplyr' 해결책을 추가했습니다. 문제는'dplyr'을 사용하여 행 이름을 추가 할 때 그룹에 의해 추가되지 않으므로 해결책이 작동하지 않는다는 것입니다.각 그룹에 대해 개별적으로'id' 변수를 추가 한 다음이를 기반으로 하위 집합을 만들 수 있습니다. – Psidom

1

이 작동 :

df[seq(which.max(df$depth)),] 
3

또 다른 방법

library(dplyr) 
df %>% group_by(Group) %>% filter(between(row_number(),1,which.max(depth))) 
+0

좋은 답변입니다. 'row_number()'는 그룹 단위로 보인다. – Psidom

+0

+1이 답변은 작동하지만 여기 필터 기능은 row_number에서 작동하므로 데이터 정렬 방법에 취약합니다. 문제를 피하기위한 간단한 사전 예방 조치는 측정 시간을 나타내는 변수 (OP의 더미 데이터에는 포함되지 않음)에서 데이터를 정렬하는 것일 수 있습니다. –

관련 문제