2016-06-15 10 views
1

dplyrを使用してデータフレームに新しい変数を追加しようとしていますが、難しかったです。dplyr:各行のすべての変数の関数として変数を追加します。

新しい変数は、(各行のすべての変数値の)長さ2の実行数である必要があります。 applyを使用して、私はこれを行うだろう:

tmp$rle = apply(tmp,1,function(x) sum(rle(x)$lengths==2)) 

は、どのように私は(すべての変数名を定義せずに)dplyrmutateを使用して、このアクションを実行することができますか?むしろdplyrより

tmp <- structure(list(X1 = c(3, 1, 1, 4, 4, 1, 3, 2, 2, 2, 1, 3, 3, 
2, 3, 1, 4, 2, 3, 2), X2 = c(2, 4, 2, 2, 3, 2, 1, 1, 3, 1, 3, 
1, 4, 4, 4, 1, 3, 1, 2, 1), X3 = c(2, 4, 3, 3, 3, 2, 4, 3, 4, 
4, 2, 3, 3, 3, 1, 3, 1, 4, 4, 2), X4 = c(1, 3, 3, 1, 1, 3, 2, 
4, 4, 1, 4, 4, 1, 1, 1, 3, 1, 3, 1, 1), X5 = c(4, 2, 4, 2, 1, 
4, 1, 2, 2, 4, 3, 4, 1, 1, 4, 4, 2, 4, 4, 3), X6 = c(3, 1, 4, 
3, 4, 4, 4, 1, 1, 3, 4, 2, 2, 2, 3, 2, 3, 2, 2, 3), X7 = c(4, 
2, 1, 1, 2, 1, 3, 3, 3, 3, 2, 2, 4, 4, 2, 4, 4, 3, 3, 4), X8 = c(1, 
3, 2, 4, 2, 3, 2, 4, 1, 2, 1, 1, 2, 3, 2, 2, 2, 1, 1, 4)), .Names = c("X1", 
"X2", "X3", "X4", "X5", "X6", "X7", "X8"), row.names = c(NA, 
20L), class = "data.frame") 

答えて

2

、あなたはRStudioはかなり最近dplyrに優れたハンドルベクトルとリスト、とりわけ、を補完するものとして導入していpurrrパッケージを使用して検討するかもしれません。あなたの場合、tmpは数値データフレームで、各行をベクトルとして扱います。 dplyrで

library(purrr) 
tmp <- tmp %>% by_row(..f=function(x) sum(rle(x)$lengths==2), 
         .to = "rle", .collate = "cols") 
1

::私はRLE機能のうち、期待すべきかの結果に不慣れだと

tmp <- mutate(tmp, rle = apply(tmp, 1, function(x) sum(rle(x)$lengths==2))) 

私はこれをQA'ing困難な時間を過ごしていたコードは次のようになります。あなたの適用バージョンのコードと結果を比較しようとしましたが、おそらく複製可能性のためにset.seed()が重要であると思われます。私はこれを正しく理解していますか?ここで

は私が作ったQAの試みである:(元 TMPがまったく同じである必要があります:私はちょうど list()structure()引数のラインを包んだ。)

set.seed(1) 
tmp <- structure(list(X1 = c(3, 1, 1, 4, 4, 1, 3, 2, 2, 2, 1, 3, 3, 2, 3, 1, 4, 2, 3, 2), 
         X2 = c(2, 4, 2, 2, 3, 2, 1, 1, 3, 1, 3, 1, 4, 4, 4, 1, 3, 1, 2, 1), 
         X3 = c(2, 4, 3, 3, 3, 2, 4, 3, 4, 4, 2, 3, 3, 3, 1, 3, 1, 4, 4, 2), 
         X4 = c(1, 3, 3, 1, 1, 3, 2, 4, 4, 1, 4, 4, 1, 1, 1, 3, 1, 3, 1, 1), 
         X5 = c(4, 2, 4, 2, 1, 4, 1, 2, 2, 4, 3, 4, 1, 1, 4, 4, 2, 4, 4, 3), 
         X6 = c(3, 1, 4, 3, 4, 4, 4, 1, 1, 3, 4, 2, 2, 2, 3, 2, 3, 2, 2, 3), 
         X7 = c(4, 2, 1, 1, 2, 1, 3, 3, 3, 3, 2, 2, 4, 4, 2, 4, 4, 3, 3, 4), 
         X8 = c(1, 3, 2, 4, 2, 3, 2, 4, 1, 2, 1, 1, 2, 3, 2, 2, 2, 1, 1, 4)), 
       .Names = c("X1", "X2", "X3", "X4", "X5", "X6", "X7", "X8"), 
       row.names = c(NA, 20L), class = "data.frame") 
tmpApply <- tmp 
tmpApply$rle = apply(tmp, 1, function(x) sum(rle(x)$lengths==2)) 
tmpDplyr <- tmp %>% mutate(rle = apply(tmp, 1, function(x) sum(rle(x)$lengths==2))) 

tmpApply    
tmpDplyr 
+0

NB:首尾 'apply'を取得しますdplyrで 'mutate'呼び出しの中で作業することは、まれに起こります。私はなぜそれが起こるようにそれがとても難しいか学ぶのが大好きです.... –

関連する問題