이번 포스팅에서는 R의 DataFrame에서 특정 조건에 해당하는 값의 행과, 해당 행의 앞, 뒤 2개 행(above and below 2 rows) 을 동시에 제거하는 방법을 소개하겠습니다.
예를 들어서, 아래와 같이 var1, var2의 두 개의 변수를 가지는 df라는 이름의 DataFrame이 있다고 했을 때, var2의 값 중 음수(-)인 값을 가지는 행과, 해당 행의 위, 아래 2개 행을 같이 제거(remove, filter) 해서 df2 라는 이름의 새로운 DataFrame을 만들어보겠습니다.
> var1 <- c(1:12) > var2 <- c(100, -200, 101, 1102, 50, 300, 100, 400, -100, 82, 90, 80) > > df <- data.frame(var1, var2) > df var1 var2 1 1 100 2 2 -200 3 3 101 4 4 1102 5 5 50 6 6 300 7 7 100 8 8 400 9 9 -100 10 10 82 11 11 90 12 12 80
|
먼저, 칼럼 var2 에서 음수(-)인 값의 조건을 만족하는 값의 행의 위치를 indexing 한 negative_idx 벡터를 만들어보겠습니다.
> # condition: if var2 value is negative, then TRUE > negative_idx <- df$var2 < 0 > negative_idx [1] FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE > |
다음으로 칼럼 var2의 값이 음수(-)인 값의 위치를 기준으로 해당 값의 행과 앞, 뒤 2개행까지는 제거(remove, filter)하고, 그 외의 값은 유지(keep_idx = TRUE) 하는 keep_idx 라는 벡터를 for loop 반복문과 if 조건문을 사용해서 만들어보겠습니다.
> keep_idx <- c(rep(TRUE, length(df$var2))) > keep_idx [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE > > for (i in 1:length(negative_idx)) { + if (negative_idx[i] == TRUE) { + keep_idx[i-2] = FALSE + keep_idx[i-1] = FALSE + keep_idx[i] = FALSE + keep_idx[i+1] = FALSE + keep_idx[i+2] = FALSE + } + } > > > keep_idx [1] FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE TRUE
|
이제 df라는 DataFrame에서 위에서 구한 keep_idx = TRUE 인 행만 indexing 해서 (즉, keep_idx = FALSE 인 행은 제거) 새로운 df2 라는 DataFrame을 만들어보겠습니다.
> # subset only rows with keep_idx = TRUE > df_filstered <- df[keep_idx, ] > df_filstered var1 var2 5 5 50 6 6 300 12 12 80 |
위는 예는 조건문과 반복문을 사용해서 indexing 해오는 방법이었구요, windows 함수인 lag(), lead()를 사용해서도 동일한 기능을 수행하는 프로그램을 짤 수도 있습니다. 다만, 이번 포스팅에서 소개한 코드가 좀더 범용적이고 코드도 짧기 때문에 lag(), lead() 함수를 사용한 방법은 추가 설명은 하지 않겠습니다.
많은 도움이 되었기를 바랍니다.
이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾹 눌러주세요.
'R 분석과 프로그래밍 > R 프로그래밍' 카테고리의 다른 글
[R] 웹사이트에서 텍스트를 가져다가 최저가 Top 10 리스트를 엑셀로 내보내기 (3) | 2018.08.06 |
---|---|
[R 프로그래밍] 반복문과 조건문을 써서 벡터에서 0이 연속 3번 나오면 구간 나누기 (6) | 2018.02.02 |
[R] 데이터프레임 다수 item을 가진 문자형 변수를 분리 후에 세로로 재구조화하기 (11) | 2016.09.29 |
[R] 여러개의 데이터프레임을 한꺼번에 하나의 데이터프레임으로 묶기, data.table package : rbindlist(data) (8) | 2016.07.10 |
[R] 폴더 내 여러개 파일들을 Loop 돌려서 자동으로 불러오기 (154) | 2016.07.02 |