2017-10-03 2 views
0

현재 일부 업스트림 계산에서 값 테이블을 만들려고하는 때가 있습니다. 일반적으로, 저는이 데이터 프레임이 생성 될 때마다 적어도 하나의 값이 1이 될 것이라고 가정했습니다. 이것은 다음과 같은 다운 스트림 처리가 발생했습니다R 파이프 체인 오류 처리에서 tryCatch() 또는 exists()

df <- data.frame(
    Experiment_Batch = c(rep("008_1", 83), 
         rep("008_6", 82), 
         rep("520_0", 2), 
         rep("944_10", 84), 
         rep("944_8", 85), 
         rep("944_9", 72)), 
    Overall = rep(0, 408) 
) 

:

df %>% 
    dplyr::count(Experiment_Batch, Overall) %>% 
    tidyr::spread(Overall, n, fill = 0) %>% 
    dplyr::select(Experiment_Batch, `1`) 

하는 오류이 사건이 아니었다,이처럼 보이는 테이블과 결국 어디하지만 예를 들어가 발생했습니다 out : Error in overscope_eval_next(overscope, expr) : object '1' not found.

나는 tryCatch()exists()을 사용해 보았지만 제대로 작동하지는 않습니다. 이상적으로 이것은 파이프 연산자를 사용하여 우아하게 처리됩니다. 이미 워크 플로에 필요한대로 개체를 만들고 if-else 문을 몇 개 추가 할 수 있음을 알고 있습니다. 그러나이 문제를 처리하는 "더 재미있는"방법이 있는지 궁금합니다. 일을 해산시켜야 해.

답변

2

열이 존재하지 않는 경우 선택을 무시하려면 선택 도우미 함수를 사용할 수 있습니다. 여기 matches("^1$") 데이터 프레임이 열이 없기 때문에, 이름이 정확히 1 일치하는 열을 선택하려고합니다, 단순히 matches 반환 integer(0)로 선택 무시 :

library(tidyverse) 
df %>% 
    count(Experiment_Batch, Overall) %>% 
    spread(Overall, n, fill = 0) %>% 
    select(Experiment_Batch, matches("^1$")) 

# A tibble: 6 x 1 
# Experiment_Batch 
#*   <fctr> 
#1   008_1 
#2   008_6 
#3   520_0 
#4   944_10 
#5   944_8 
#6   944_9 

matches 반환 integer(0) 때 비

matches("^1$", vars = c("0", "experiment")) 
# integer(0) 

matches("^1$", vars = c("0", "experiment", "1")) 
# [1] 3 

,536,913,632 : 열 이름의 select에서 무시됩니다 패턴과 일치 10

오류 캐치를 맞춤 설정해야하는 경우 :

library(tidyverse) 
df %>% 
    count(Experiment_Batch, Overall) %>% 
    spread(Overall, n, fill = 0) %>% 
    { 
     tryCatch(
      select(., Experiment_Batch, `1`), 
      error=function(e) select(., Experiment_Batch) 
     ) 
    } 
    # replace the error with the customized function to handle the exception 

# A tibble: 6 x 1 
# Experiment_Batch 
#*   <fctr> 
#1   008_1 
#2   008_6 
#3   520_0 
#4   944_10 
#5   944_8 
6   944_9