2017-10-10 5 views
0

内の値を再配置し、作るためにいくつかのマイナーな修正を持ってElegently ...私はPDFのテキストレイヤーで働いているデータフレーム

私が生成したデータフレームきちんとオフになっている1つのまたは2つのデータ値を持っています一列で私は間違って配置された値(他の変数の組み合わせによって定義される)の '座標'を持ち、実際にどこに行くべきかの位置を持っています。この中に、

data.frame(A = 1:3, 
      B = 1:3, 
      C = c("Oops wrong row", NA, "this one is OK")) 

変更これ:私はAからBにデータ値を移動し、例えばAに対応する行をフィルタリングする必要が

data.frame(A = 2:3, 
      B = 2:3, 
      C = c("Oops wrong row", "this one is OK")) 

Iがきこれを達成するためにいくつかのコードを書いた。しかし、それははるかに冗長である必要があるようです。また、この例では、関数はデータフレームの付随的な機能に依存しているようです。私はこれが一般的な仕事かもしれないと思った - この種の仕事のための標準的なパターンがあるか?または少なくともよりエレガントなアプローチですか?

df <- data.frame(A = 1:3, 
       B = 1:3, 
       C = c("Oops wrong row", NA, "this one is OK")) 

get_row <- function(df, A, B, output = "index") { 

    index <- which(df[["A"]] == A & df[["B"]] == B) 

    if (output == "index") { 
    return(index) 
    } 
    else if (output == "C") { 
    return(df[["C"]][[index]]) 
    } 

} 

correct_df <- function(df) { 

    from <- list(A = 1, 
       B = 1) 

    to <- list(A = 2, 
      B = 2) 

    df <- df %>% 
    dplyr::mutate(C = replace(C, 
           get_row(., to[["A"]], to[["B"]]), 
           get_row(., from[["A"]], from[["B"]], 
              output = "C"))) %>% 
    dplyr::filter(A != from[["A"]] | B != from[["B"]]) 

    return(df) 

} 

答えて

0

私はあなたの本当のケースはおそらく、もう少し複雑なあなたの例よりもですが、これは私が正常にdplyr::case_when()で行うタスクの一種である疑いがあります。

変更する必要がある行を定義する条件がある場合は、case_when()呼び出しで論理条件として使用します。既存の変数を置き換えるのではなく、新しい変数を作成することに注意してください。何が起こったかを簡単に確認できます。

df <- data.frame(A = 1:3, 
      B = 1:3, 
      C = c("Oops wrong row", NA, "this one is OK")) 
df %>% 
    mutate(D = case_when(
    .$C == "Oops wrong row" & !is.na(.$C) ~ .$C[is.na(.$C)], 
    is.na(.$C) ~ .$C[.$C == "Oops wrong row" & !is.na(.$C)], 
    TRUE ~ .$C 
)) 
関連する問題