2016-07-12 18 views
1

私はコードを単純化する簡単な方法を検討しています。magrittrリバースパイプを使用して非標準評価構文を書く

sqrt関数は簡単以下の列のサブセットに適用することができます。

require(magrittr) 
mtcars[,-which(colnames(mtcars) %in% 
       c("mpg", "cyl", "drat", "wt", "carb", 
        "hp", "qsec", "vs", "am", "gear"))] %<>% 
    sqrt 

問題

私はなしサブセットに再び全体のサブセットのシーケンスを入力する必要性を他の変換を適用するに興味があります。

例えばコード:.を使用して、構文と同じ

Error in function_list[[k]](value) : could not find function ".data" 

mtcars[,-which(colnames(mtcars) %in% 
       c("mpg", "cyl", "drat", "wt", "carb", 
        "hp", "qsec", "vs", "am", "gear"))] %<>% 
    .data * 1000 

はエラーを返します。私の質問は:構文上、sqrt関数と同じ効果を得ることができますが、渡されたサブセットに長い関数を適用する方法はありますか?

+0

は、\ '* \'(1000) ''で '.dataセクション* 1000 'を置き換えますか?それを関数であり、演算子ではないと呼びますか? – Tensibai

+0

@Tensibai興味深いアプローチですが、どのようにして効率的に多くの操作を行うことができますか?乗算は潜在的な使用法の一例に過ぎません。実際には、私はこのデータのためにいくつかのことをしたいと思います。 – Konrad

+1

互換出力を返すカスタム関数を記述しますか? (ベクトルのためのベクトルなど)、または彼/彼女の答えに展示された@Uweのようなただの無名関数。私は1のために投票するので、関数だけでもテストできます。私は: '%<>%{。 * 10 - 1000} '例えば – Tensibai

答えて

3

sel_cols <- setdiff(colnames(mtcars), 
        c("mpg", "cyl", "drat", "wt", "carb", 
         "hp", "qsec", "vs", "am", "gear")) 
mtcars[, sel_cols] %<>% {sqrt(.) %>% `*`(1000)} 

またはdata.tableアプローチですか?

library(data.table) 
sel_cols <- setdiff(colnames(mtcars), 
        c("mpg", "cyl", "drat", "wt", "carb", 
         "hp", "qsec", "vs", "am", "gear")) 

dt <- as.data.table(mtcars) 
dt[, (sel_cols) := lapply(.SD, sqrt), .SDcols = sel_cols][] 

とパイプと組み合わせる:

dt <- as.data.table(mtcars) 
dt[, (sel_cols) := lapply(.SD, function(x) {sqrt(x) %>% `*`(1000)}), .SDcols = sel_cols][] 
+0

入力いただきありがとうございます。最初の提案は、Tensiabiが彼のコメントで提案したものと非常に似ています。データテーブルアプローチの面では、非常に興味深いですが少し長めです。 – Konrad

+0

最後の[]はdata.tableに近づくと不要になり、信号dtが更新されます。 Advantageはcopyなしでdata.tableの更新を行います(巨大なデータセットでは、新しいベクターを作成して元のベクターと置き換えることはありません)。 1つ以上のカラムが返された場合はlapplyを使用し、magrittr btwの場合は同じことが必要です。 cc @konrad – Tensibai

+0

@dwe setDTは、同時にdata.tableのキーとなり、クロスジョイントなどを許可するので、あなたは 'as.data.table'の代わりに' setDT(mtcars) 'を好むべきです。 – Tensibai

関連する問題