2017-10-28 1 views
0

내 첫 번째 질문은 여기 :) 내가 잘못하고있는 것일 수도있는 사전에 사과!여러 열을 기반으로 한 검색 r

나는이처럼 보이는 dataframe이 (물론이 방법이 더 크다) :

> df1 
# A tibble: 10 x 4 
    index1 index2  date1  date2 
    <int> <int>  <date>  <date> 
1 5800032  6 2012-07-02 2013-09-18 
2 5800032  7 2013-09-18 1970-01-01 
3 5800254  6 2013-01-04 1970-01-01 
4 5800261  5 2012-01-23 2013-02-11 
5 5800261  6 2013-02-11 2014-02-05 
6 5800261  7 2014-02-05 1970-01-01 
7 3002704  7 2012-01-23 1970-01-01 
8 3002728  7 2012-10-20 1970-01-01 
9 3002810  7 2012-07-18 1970-01-01 
10 8504593  3 2012-01-11 1970-01-01 

원래의 변수는 다음과 같습니다로부터 index1, index2 및 날짜 1. 같은 index1 값을 갖는 레코드가 하나 이상 있습니다 (시퀀스는 index2에 의해 결정됩니다). 내 목표는 index1의 동일한 값에 대한 date1의 결과 값 사이의 간격을 필터링하는 것입니다. 즉, 간격을 만들 때 index1 값이 같은 레코드가 두 개 이상 있어야합니다. 그래서 date1에서 시작하는 간격의 종료 날짜를 제공하는 date2 변수를 만들었습니다. 이것은 결과 레코드의 date1과 간단하게 같습니다 (date2 [n] = date1 [n + 1]). 주어진 index1 값에 대해 date1 [n]이 가장 최근의 날짜 일 경우, date2 [n] < -

df를 index1로 정렬하는 것보다 더 좋은 아이디어를 얻을 수 없었습니다. index2 및 루프를 실행 :

for (i in 1:(nrow(df1)-1)){ 
    if (df1$index1[i] == df1$index1[i+1]){ 
    df1$date2[i] <- df1$date1[i+1] 
    } 
    else{df1$date2[i] <- 0} 
} 

그것은 종류의 일을하지만 눈에 띄게 느린이었고, 어떤 이유로 그것은이 있어야 모든 값을 "발견"하지 않았다. 또한,이 작업을 수행하는 훨씬 지능적인 방법이 있어야합니다. 가능하면 sapply 기능이 있어야합니다. 모든 아이디어를 높이 평가합니다!

+0

무엇을 하려는지 확실하지 않지만 'dplyr'을 사용하면 그룹 및 필터에 도움이됩니다. . 예를 들어,'require (dplyr); df1 %> % group_by (index1) %> % arrange (index2)'는 색인을 함께 그룹화하고 index2에 의해 각 그룹 내에 정렬합니다. 더 많이하기 전에 내가 원하는 것을 더 잘 이해할 필요가 있습니다. – ssp3nc3r

+0

감사합니다. 설명하려고 : 내가 date1 열에 날짜 지점의 목록을 가지고 있지만 내가 필요한 건 동일한 index1 값에 대해 이러한 날짜 지점 사이의 간격을 정의하는 것입니다, 그래서 나는 data2 열에 간격의 끝 날짜를 추가해야합니다. . 첫 번째 간격은 date1 [min]과 date1 [min + 1] 사이이며 두 번째 간격은 date1 [min + 1]과 date1 [min + 2] 사이에 있습니다. date1 [n]에서 시작하는 간격의 종료 날짜는 date2 [n]이며 date1 [n + 1]과 같습니다. 주어진 index1 값에 대해 하나의 레코드 만있는 경우 간격에 두 개의 날짜 지점이 필요하기 때문에 date2 = 0입니다. 데이터 1 [최대]와 동일합니다. – AadiR

+0

실제로 0을 표시하려면 데이터 프레임의 각 열이 같은 유형이어야하므로'date1'을 문자와 같은 것으로 변환해야합니다 :'df1 %> % group_by (index1) %> % % mutate (date1 = as.character (date1)) %> % mutate (date2 = 지연 (날짜 1, 기본값 = "0"))'실제 0을 지정하십시오. – ssp3nc3r

답변

0

당신은 내가 명확하게 질문의 필터링 부분을 이해하지 못했다

df1 %>% 
    group_by(index1) %>% 
    arrange(index2) %>% 
    mutate(date2 = lag(date1, default=0)) 

dplyr에서 지연을 사용하여 DATE2 만들 수 있습니다. 귀하의 문제는 기본 날짜 (1970-01-01)에 필터링 (값 = 0)과 관련이있을 수 있습니다. (값 = 0)

관련 문제