data.frame을 필터링해야 할 때, 즉 특정 조건을 만족하는 행을 추출하려면 subset
함수 를 사용하는 것이 좋습니다 .
subset(airquality, Month == 8 & Temp > 90)
[
기능이 아닌 :
airquality[airquality$Month == 8 & airquality$Temp > 90, ]
내가 선호하는 두 가지 주요 이유가 있습니다.
-
왼쪽에서 오른쪽으로 코드가 더 잘 읽 힙니다. R에 대해 전혀 모르는 사람들조차도
subset
위 의 진술이 무엇을하고 있는지 말할 수 있습니다. -
select
표현식 에서 열을 변수 라고 할 수 있으므로 몇 가지 키 입력을 저장할 수 있습니다. 위의 예에서는로airquality
한 번만 입력 하고subset
로 세 번 입력해야했습니다[
.
그래서 나는 subset
짧고 잘 읽히기 때문에 어디에서나 행복하게 살고 있었고, 동료 R 코더에게 아름다움을 옹호하기까지했습니다. 그러나 어제 세상은 무너졌습니다. subset
설명서를 읽는 동안 이 섹션을 확인했습니다.
경고
대화식으로 사용하기위한 편리한 기능입니다. 프로그래밍의 경우에는 [와 같은 표준 하위 설정 기능을 사용하는 것이 좋으며, 특히 인수 하위 집합의 비표준 평가는 예상치 못한 결과를 초래할 수 있습니다.
저자가 무엇을 의미하는지 명확히하는 데 도움이 될 수 있습니까?
먼저, ” 대화식으로 사용 “이란 무엇을 의미 합니까? BATCH 모드에서 실행되는 스크립트와 달리 대화 형 세션이 무엇인지 알고 있지만 어떤 차이가 있는지는 알 수 없습니다.
그런 다음 ” 비표준 부분 집합의 비표준 평가 “를 설명 하고 왜 위험한지 설명해 주시겠습니까?
답변
이 질문의 위험 해들리 위컴의 탁월한 설명을 가리키는 @ 제임스에 의해 코멘트에 잘 대답했다 subset
(그 같은 및 기능) [여기] . 읽어봐!
다소 오래 읽었으므로 Hadley가 “무엇이 잘못 될 수 있는가?”라는 질문을 가장 직접적으로 다루는 사례를 여기에 기록하면 도움이 될 수 있습니다.
Hadley는 다음 예제를 제안합니다. 다음 함수를 사용하여 데이터 프레임을 서브 세트 한 다음 재정렬하려고한다고 가정하십시오.
scramble <- function(x) x[sample(nrow(x)), ]
subscramble <- function(x, condition) {
scramble(subset(x, condition))
}
subscramble(mtcars, cyl == 4)
오류가 반환됩니다.
eval (expr, envir, enclos) 오류 : ‘cyl’개체를 찾을 수 없습니다
R은 더 이상 ‘cyl’이라는 객체를 찾을 위치를 “알지”않기 때문입니다. 그는 또한 지구 환경에 ‘cyl’이라는 물체가 있으면 우연히 일어날 수있는 기괴한 점을 지적합니다.
cyl <- 4
subscramble(mtcars, cyl == 4)
cyl <- sample(10, 100, rep = T)
subscramble(mtcars, cyl == 4)
(그들을 실행하고 직접 참조하십시오, 그것은 꽤 미쳤습니다.)
답변
또한 [
더 빠릅니다.
require(microbenchmark)
microbenchmark(subset(airquality, Month == 8 & Temp > 90),airquality[airquality$Month == 8 & airquality$Temp > 90,])
Unit: microseconds
expr min lq median uq max neval
subset(airquality, Month == 8 & Temp > 90) 301.994 312.1565 317.3600 349.4170 500.903 100
airquality[airquality$Month == 8 & airquality$Temp > 90, ] 234.807 239.3125 244.2715 271.7885 340.058 100