2017-12-14 6 views
2

아래 예에서는 vals_int에 가장 가까운 value이 어느 것인지 확인하려고 시도하고 있습니다. id입니다. 나는이 문제를 sapply()을 사용하여 다음과 비슷한 문제를 해결할 수 있지만 sapply() 부분이 dplyr에 다른 함수로 수행 될 수 있는지 궁금해합니다.dplyr을 통한 sapply 결과

메서드와 출력을 dplyr 패키지의 일부 기능을 사용하여 재생할 수 있다면 정말로 관심이 있습니다. 나는 do()가 작동할지 모르지만 어떻게 결정할 지 고심하고 있습니다.

library(tidyverse) 

df <- data_frame(
    id = rep(1:10, 10) %>% 
    sort, 
    visit = rep(1:10, 10), 
    value = rnorm(100) 
) 

vals_int <- c(1, 2, 3) 

tmp <- sapply(vals_int, 
       function(val_i) abs(df$value - val_i)) 

답변

3

그래, 당신과 같이, 모든 행에 같은 작업을 수행 할 수 dplyr에 rowwise()do() 기능을 사용할 수 있습니다

df %>% rowwise %>% do(diffs = abs(.$value - vals_int)) 

이 열이 새로운 tibble에 diffs라는 만들 것이다 길이가 3 인 벡터 목록입니다. do()이 반환하는 출력을 강제로 데이터 프레임으로 반환하면 대신에 각 값을 빼서 3 개의 열이있는 tibble이 만들어집니다.

df %>% rowwise %>% do(as.data.frame(t(abs(.$value - vals_int)))) 
1

@qdread에 의한 대답은 당신이 찾고있는 무엇을 수행하지만, tidyverse (즉 당신에게 중요한 경우, 나도 몰라) 떨어진 do() 기능에서 이동하기 시작한다. 다음은 purrr 패키지의 map을 사용하는 대체 방법입니다. 당신이 제공

df %>% 
    mutate(closest = map(value, function(x){ 
    abs(x - vals_int) %>% 
     t() %>% 
     as.tibble() 
    })) %>% 
    unnest() 

: 주석에 대한

# A tibble: 100 x 6 
     id visit  value   V1  V2  V3 
    <int> <int>  <dbl>  <dbl> <dbl> <dbl> 
1  1  1 0.91813183 0.08186817 1.081868 2.081868 
2  1  2 -1.68556173 2.68556173 3.685562 4.685562 
3  1  3 -0.05984289 1.05984289 2.059843 3.059843 
4  1  4 0.40128729 0.59871271 1.598713 2.598713 
5  1  5 -0.09995526 1.09995526 2.099955 3.099955 
6  1  6 0.81802663 0.18197337 1.181973 2.181973 
7  1  7 -1.49244225 2.49244225 3.492442 4.492442 
8  1  8 -0.74256185 1.74256185 2.742562 3.742562 
9  1  9 -0.43943907 1.43943907 2.439439 3.439439 
10  1 10 0.54985857 0.45014143 1.450141 2.450141 
# ... with 90 more rows 
+0

덕분에, 나뿐만 아니라이 솔루션을 주셔서 감사합니다. 실제로 나는 이전에 본 함수 (map)를 생각하려고했지만, 그것이 무엇인지 불렀던 것을 기억하지 못했습니다. @tbradley를 지적 해 주셔서 감사합니다. –

+0

예,''purr' 패키지를 강력히 추천합니다. 'map'은'lapply'처럼 동작하지만'map_dbl'과'map_chr' 함수는리스트가 아닌 벡터를 반환한다는 점에서'sapply'와 같은 역할을합니다. 'purrr' 패키지는 일관성을 염두에두고 설계 되었기 때문에 서로 다른 함수 사이를 전환하는 번거 로움이 적습니다. 모두 같은 순서로 동일한 인수를 취하고 리턴 값의 변동성이 적습니다 (특히'sapply'에 비해) – tbradley