R에서 sapply와 lapply의 차이점은 무엇입니까? 언제 하나를 사용해야합니까? 보너스 : 언제 vapply를 사용해야합니까?


대답 1:

나는 * apply 함수가 :-) 무엇을하는지 이미 알고 있다고 가정합니다.

lapply와 sapply의 주요 차이점은 sapply가 lapply의 출력을 최대한 많이 단순화하려고 시도한다는 것입니다. 함수가 목록의 각 요소에 대해 단일 값을 반환하면 sapply는 해당 값을 가진 벡터를 반환합니다. 예를 들어 목록 요소의 길이를 확인하려는 경우에 유용합니다.

또 다른 가능성은 함수가 각 목록 요소에 대해 동일한 크기의 벡터 (예 : 범위 및 Quantile 함수)를 반환 할 수 있습니다. 이 경우 sapply는 벡터 길이와 동일한 행 수와 목록 길이와 같은 열 수를 가진 행렬을 반환합니다.

sapply가 출력을 단순화 할 수없는 경우 lapply와 정확히 동일하게 작동합니다.

이제 sapply의 반환 값에 대한 모호성 (때로는 목록, 때로는 행렬 또는 벡터)으로 팩을 개발하는 것이 필요 이상으로 복잡해집니다. Sapply를 사용하고 적절한 예외를 throw 할 때 각 반환 값의 클래스를 수동으로 확인해야합니다 (적어도해야합니다). Vapply는 FUN.VALUE 인수 로이 문제를 해결합니다. 출력 (문자, 숫자, 정수, 팩터 등) 및 출력 길이를 명시 적으로 정의해야합니다.

나는 당신이 이미 vapply를 사용할 때를 상상할 수 있다고 생각합니다. 다른 사람이 당신의 기능을 사용할 수 있도록 할 때마다, vapply를 선호하여 Sapply를 버려야합니다 :-).


대답 2:

sapply는 가능한 경우 lapply의 결과를 단순화하려고 시도합니다. 그래서:

  • lapply의 결과가 모든 요소의 길이가 1 인 목록 인 경우 sapply는 벡터를 반환합니다. 결과가 모든 요소가 같은 길이 (> 1)의 벡터 인 목록 인 경우 행렬이 반환됩니다. 상황을 파악할 수 없으면 목록이 반환됩니다.

예 :

lapply와 함께 :

> x <-목록 (a = 1 : 4, b = rnorm (10), c = rnorm (20, 1), d = rnorm (100, 5))> lapply (x, 평균) $ a [1] 2.5 $ b [1] 0.06082667 $ c [1] 1.467083 $ d [1] 5.074749

sapply와 함께 :

> sapply (x, mean) abcd 2.50000000 0.06082667 1.46708277 5.07474950

대답 3:

예를 들어 드리겠습니다.

이것은 작동하지만 두 번째는 작동하지 않습니다.

# 1

l <-목록 ( "a", "b", c ( "x", "y"), c ( "1", "3", "4"))

sz <-max (적용 (l, 기능 (x) 길이 (x)))

# 2

l <-목록 ( "a", "b", c ( "x", "y"), c ( "1", "3", "4"))

sz <-max (lapply (l, 함수 (x) 길이 (x)))

max () 함수는 목록에만 적용되지 않고 벡터에만 적용되기 때문입니다. 그리고 lapply는 list를 반환하고 sapply는 벡터를 반환합니다.