it-swarm.dev

왜 [```서브 세트보다 낫지?

Data.frame을 필터링해야 할 때, 즉 특정 조건을 충족하는 행을 추출 할 때 subset 함수를 사용하는 것이 좋습니다.

subset(airquality, Month == 8 & Temp > 90)

[ 함수 대신 :

airquality[airquality$Month == 8 & airquality$Temp > 90, ]

내 취향에 두 가지 주요 이유가 있습니다.

  1. 코드가 왼쪽에서 오른쪽으로 잘 읽혀집니다. R에 대해 모르는 사람들이라도 위의 subset 문이 무엇을하는지 알 수 있습니다.

  2. select 표현식에서 열을 변수로 참조 할 수 있으므로 몇 가지 키 입력을 줄일 수 있습니다. 위의 예에서 airqualitysubset에 한 번만 입력하고 [에는 세 번 입력해야했습니다.

subset을 사용하여 행복하게 살고 있었기 때문에 더 짧고 잘 읽었으며 동료 R 코더들에게도 그 아름다움을 널리 알리기까지했습니다. 그러나 어제 나의 세계는 헤어졌다. subset 문서를 읽는 동안이 섹션이 표시됩니다.

경고

이는 대화식으로 사용하기위한 편리한 기능입니다. 프로그래밍의 경우 [[와 같은] 표준 하위 집합 함수를 사용하는 것이 더 좋으며 특히 인수 하위 집합의 비표준 평가는 예기치 않은 결과를 초래할 수 있습니다.

누군가가 저자의 뜻을 명확히하는 데 도움이 될 수 있습니까?

첫째, " 대화식으로 사용하기 위해 "는 무엇을 의미합니까? 대화식 세션이 무엇인지 알고 있습니다. 스크립트가 BATCH 모드에서 실행되는 것과는 대조적으로 어떤 차이가 있는지는 알 수 없습니다.

그런 다음 " 인수 하위 집합 의 비표준 평가를 설명하고 왜 위험한 지, 예를 들어 설명해 주시겠습니까?

383
flodel

이 질문은 @James의 코멘트에서 Hadley Wickham이 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)

(그들을 실행하고 직접 볼, 그것은 꽤 미친거야.)

229
joran

또한 [는 더 빠릅니다.

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
26
bartektartanus