programing

서브셋보다 []이 더 좋은 이유는 무엇입니까?

megabox 2023. 6. 8. 19:35
반응형

서브셋보다 []이 더 좋은 이유는 무엇입니까?

data.frame을 필터링해야 할 때(즉, 특정 조건에 맞는 행을 추출해야 할 때),subset함수:

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

그보다는.[함수:

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

제가 선호하는 이유는 크게 두 가지입니다.

  1. 코드가 왼쪽에서 오른쪽으로 더 잘 읽힙니다.심지어 R에 대해 아무것도 모르는 사람들도 무엇이subset위의 진술이 하고 있습니다.

  2. 열을 변수로 참조할 수 있기 때문입니다.select식, 키 입력 몇 개를 저장할 수 있습니다.위의 예에서는 다음을 입력하기만 하면 되었습니다.airquality와 한 번만subset하지만 세 번이나[.

그래서 저는 행복하게 살고 있었습니다.subset모든 곳에서 그것은 더 짧고 더 읽기 때문에, 심지어 내 동료 R 코더들에게 그것의 아름다움을 옹호합니다.하지만 어제 내 세상은 산산조각이 났습니다.책을 읽는 동안subset설명서, 다음 섹션이 표시됩니다.

경고

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

저자들이 의미하는 바를 명확히 해줄 수 있는 사람이 있습니까?

첫째, "대화형 사용"이란 무엇을 의미합니까?BATCH 모드에서 실행되는 스크립트와 달리 대화형 세션이 무엇인지는 알고 있지만 어떤 차이가 있어야 하는지는 모르겠습니다.

그렇다면 "논쟁 부분 집합의 비표준 평가"와 그것이 왜 위험한지 설명해 주시겠습니까, 예를 들어 주시겠습니까?

이 질문은 @James의 댓글에서 잘 답변되었으며, 위험에 대한 Hadley Wickham의 훌륭한 설명을 가리켰습니다.subset(그리고 그것과 같은 기능) [여기].읽어보세요!

다소 긴 읽기이므로 해들리가 "무엇이 잘못될 수 있는가?"라는 질문을 가장 직접적으로 다루는 예를 여기에 기록하는 것이 도움이 될 수 있습니다.":

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

언급URL : https://stackoverflow.com/questions/9860090/why-is-better-than-subset

반응형