2017-10-03 6 views
0

現在、アップストリームの計算値からテーブルを作成しようとしています。通常、これらのデータフレームが作成されるたびに、少なくとも1つの値が1になると仮定しています。Rパイプチェーンのエラー処理でtryCatch()またはexists()が発生する

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

エラーのため:これは、次の下流の処理が発生している

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

:私はこれはそうではなかった、とこのようになりますテーブルになってしまった例が発生しましたアウト:Error in overscope_eval_next(overscope, expr) : object '1' not found

私はtryCatch()exists()を使ってみましたが、これらは正しく動作するようには思えません。理想的には、パイプ演算子を使用してエレガントに処理されます。私はすでにオブジェクトを作成し、必要に応じていくつかのif-elseステートメントをワークフローに追加することができることを知っていますが、これが面倒であるかどうかはわかりません。仕事を分割しなければならない。

答えて

2

カラムが存在しない場合に選択を無視する場合は、選択ヘルパー関数を使用できます。

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$")は、データフレームが列を持っていないので、それは単にmatches戻りinteger(0)として選択を無視し、その名を正確に1に一致する列を選択しようとします

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

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

:列名の 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 
関連する問題