예제데이터를 아래와 같이 만들어볼게요.
참고로 예제는 데이터프레임 형식으로 만들었어요.
data <- data.frame(int1=LETTERS, int2=1:26, int3=rnorm(26))
data
## int1 int2 int3
## 1 A 1 0.03542781
## 2 B 2 0.07652803
## 3 C 3 -0.37203678
## 4 D 4 -0.47640553
## 5 E 5 -0.56042448
## 6 F 6 0.44690176
## 7 G 7 -0.38123402
## 8 H 8 -0.68383971
## 9 I 9 -0.41867114
## 10 J 10 0.52504933
## 11 K 11 0.21770481
## 12 L 12 -0.68227919
## 13 M 13 0.16576876
## 14 N 14 -0.47159084
## 15 O 15 0.25877834
## 16 P 16 1.14337630
## 17 Q 17 0.65212121
## 18 R 18 1.22687331
## 19 S 19 0.34854933
## 20 T 20 0.91780384
## 21 U 21 2.65309157
## 22 V 22 1.47426800
## 23 W 23 -0.85032534
## 24 X 24 -0.21159773
## 25 Y 25 2.20264869
## 26 Z 26 -1.30484965
음.. 아마도 원하지 않을 정석방법을 굳이 보여드리자면
data[data$int1!="A", ]
## int1 int2 int3
## 2 B 2 0.07652803
## 3 C 3 -0.37203678
## 4 D 4 -0.47640553
## 5 E 5 -0.56042448
## 6 F 6 0.44690176
## 7 G 7 -0.38123402
## 8 H 8 -0.68383971
## 9 I 9 -0.41867114
## 10 J 10 0.52504933
## 11 K 11 0.21770481
## 12 L 12 -0.68227919
## 13 M 13 0.16576876
## 14 N 14 -0.47159084
## 15 O 15 0.25877834
## 16 P 16 1.14337630
## 17 Q 17 0.65212121
## 18 R 18 1.22687331
## 19 S 19 0.34854933
## 20 T 20 0.91780384
## 21 U 21 2.65309157
## 22 V 22 1.47426800
## 23 W 23 -0.85032534
## 24 X 24 -0.21159773
## 25 Y 25 2.20264869
## 26 Z 26 -1.30484965
저는 정석방법도 좋아하지만, 생산성을 고려할 때 너무 불편하다고 판단되면 A방법대신 B방법을 택합니다.
library(dplyr)
data %>% filter(int1!="A")
## int1 int2 int3
## 1 B 2 0.07652803
## 2 C 3 -0.37203678
## 3 D 4 -0.47640553
## 4 E 5 -0.56042448
## 5 F 6 0.44690176
## 6 G 7 -0.38123402
## 7 H 8 -0.68383971
## 8 I 9 -0.41867114
## 9 J 10 0.52504933
## 10 K 11 0.21770481
## 11 L 12 -0.68227919
## 12 M 13 0.16576876
## 13 N 14 -0.47159084
## 14 O 15 0.25877834
## 15 P 16 1.14337630
## 16 Q 17 0.65212121
## 17 R 18 1.22687331
## 18 S 19 0.34854933
## 19 T 20 0.91780384
## 20 U 21 2.65309157
## 21 V 22 1.47426800
## 22 W 23 -0.85032534
## 23 X 24 -0.21159773
## 24 Y 25 2.20264869
## 25 Z 26 -1.30484965
생산성을 고려하면 A이든 B이든 코드한줄이며 코드의 양도 별차이 없어 생산성의 차이가 크지 않은 것 같아요.
조건 하나를 더 걸어볼게요.
int1 이 “A” 외인 조건과 int3 가 양수인 것만 남기고 int2 변수는 고려하지 않는다고(생략한다고) 가정해보면,
data[data$int1!="A" & data$int3>=0, names(data)!="int2"]
## int1 int3
## 2 B 0.07652803
## 6 F 0.44690176
## 10 J 0.52504933
## 11 K 0.21770481
## 13 M 0.16576876
## 15 O 0.25877834
## 16 P 1.14337630
## 17 Q 0.65212121
## 18 R 1.22687331
## 19 S 0.34854933
## 20 T 0.91780384
## 21 U 2.65309157
## 22 V 1.47426800
## 25 Y 2.20264869
data %>%
filter(int1!="A", int3>=0) %>%
select(-int2)
## int1 int3
## 1 B 0.07652803
## 2 F 0.44690176
## 3 J 0.52504933
## 4 K 0.21770481
## 5 M 0.16576876
## 6 O 0.25877834
## 7 P 1.14337630
## 8 Q 0.65212121
## 9 R 1.22687331
## 10 S 0.34854933
## 11 T 0.91780384
## 12 U 2.65309157
## 13 V 1.47426800
## 14 Y 2.20264869
이때부터는 아마 B방법이 정서상 좋을 것 같아요.
원하시는 쉽게하는 방법이 될 것입니다.
단 dplyr package 를 공부해야 된다는게 필요하지만, 구글에 검색해보면 저보다 훨씬 재미있게 (한글로!)설명해주는 글들이 많이 있어요.
저도 처음에는 subset() 함수를 즐겨 사용했지만, 전처리 조건들이 많아지면서 subset() 은 잠시 데이터셋의 부분집합을 참조할 때만 사용하게 되었고, 코어코드에는 dplyr package 의 함수들을 파이프라인 연산자(%>%)를 이용하여 sub dataset 을 구축하고 있어요.
filter() 함수도 dplyr package 의 함수이신것을 아실테고 subset() 과 비슷한 함수지만 제가 드리고싶은 말은 dplyr package 의 다양한 함수들과 묶어 filter() 를 조화시킨다면 좀 더 통일성있는, 머리 굴러가는대로의 전처리 코딩이 가능한 것 같아요.
하지만 이것도 취향문제이기 때문에 또다른 좋은 방법이 있을 수도 있습니다.
※ 카페모임에 대해서 생각해본적은 사실 없었어요 ㅎㅎ… 하지만 최근에는 데이터분석관련해 여러가지 이런저런 수다를 나누고 싶은 카페 회원분들이 있다면 다같이 판교와 같은 테크노벨리(?)에서 분위기 좋게 커피타임을 가져보고싶은 생각은 있습니다 :)