2016-07-05 3 views
0

私は、多数の変数を持つデータフレームを持っています。これらの変数のサブセットは名前に1つの数字(例:x1_vおよびx2_v)を持つ名前を持ち、これらの変数の値を任意のサイズのサブセットに対して再コードしたいとします。私はforループを使って次のことを試みましたが、何もコード化しません。文字列(変数)をループして値をコード化する方法は?

library(car) 
library(magrittr) 

# Sample df 
x1_v <- seq(1:5) 
x2_v <- rep(5,5) 
fun <- c("a","b","c","r","q") 
data <- data.frame(x1_v, x2_v, fun) 

# Loop 
for (i in 1:2){ 
paste0("data$x", i, "_v") %>% 
    assign(paste0("data$x", i, "_v") %>% 
    recode("c(0, 5) = NA")) 
} 

私はこれがループしassign()使用してほとんどすべてのRプロトコルに違反知っているが、私は、これは

  • を動作しませんなぜに適用するようなものを使用する可能性がありますどのように

    1. を理解しようとしていますこれに対処する。

    私はリストを作ることが理にかなっていると思いますが、私はすべてのデータを最後にデータフレームクラスに保存したいと思います。

  • +0

    'ライブラリ(車)'私はあなたが出力になりたいものの例を提供するために役に立つかもしれません 'recodeの()' – thelatemail

    +0

    を参照するために推測しています? –

    答えて

    0
    1. これは動作しませんビットです:

      assign(paste0("data$x", i, "_v") %>% 
          recode("c(0, 5) = NA") 
      

      それはベクトル変数を必要とするときあなたがvarのための「データ$ x1_v」等のrecode文字列を渡しています。式と関数の呼び出しを形成するために文字列を結合する領域に入るには、eval()を参照する必要がありますが、それはあなたがやろうとしていることに対して過度の方法だと思います。そのようなプログラミングスタイルを避けるもう一つの理由は、%>%でうまくいきません。

    2. コードを正しく読み込んだ場合、名前の特定のパターンと一致するデータフレームの列をコード化しようとしています。あなたはベクトル化された解決法を求めており、dplyrはそれを助ける施設を持っています。 dplyr::mutate_at()が良い選択でしょう。 dplyr::recode()がありますが、すべてのケースを徹底的に指定する必要があり、タイプについては非常に精通しています。

      library(dplyr) 
      data %>% 
          mutate_at(.funs = funs(recode(., `0` = NA_real_, 
                   `5` = NA_real_, 
                   `1` = 1, 
                   `2` = 2, 
                   `3` = 3, 
                   `4` = 4)), 
             .cols = vars(matches("x[0-9].*_v")) 
          ) 
      

      x#_vものを見つけるために、列名に正規表現マッチをやっている.cols = vars(matches("x[0-9].*_v")の使用:たとえば、これは私がdplyr::recode()とあなたの意図を取り込むに来る可能性が最も近いです。また、funs()の中には、.は「私が操作している列」を参照しています。 'パイプで渡された出力'ではありません。

      ifelse()またはif_else()が最適です。 ifelse()(遅く、少ないタイプセーフ):

      data %>% 
          mutate_at(.funs = funs(ifelse(. == 0| . == 5, 
                  yes = NA, 
                  no = .)), 
             .cols = vars(matches("x[0-9].*_v")) 
          ) 
      

      if_else()は、現在されていない、同じようにx2_vx1_vの種類を必要とします。 x2_v <- rep(as.integer(5),5)これを修正します。その後、行うことができます:

      data %>% 
          mutate_at(.funs = funs(if_else(. == 0| . == 5, 
                  true = NA_integer_, 
                  false = .)), 
             .cols = vars(matches("x[0-9].*_v")) 
      ) 
      
    関連する問題