2017-08-12 6 views
0

ループ内で適用されるカスタム関数を作成しようとしていますが、私のテーブルのすべての変数に必要なすべての情報をテーブルに与えようとしています。私の機能はdplyrの機能とbaseに基づいています。Rデータフレーム内のすべての変数に適用するカスタム関数

myfun <- function(x, y) summarise(x, var=names(x[y]), n=sum(!is.na(y)), blank=n()-sum(!is.na(y)), distinct=n_distinct(y, na.rm=TRUE)) 

私の問題は、base機能(names())が権利を与えるために引用符を与えられることにy引数(変数名)が必要ですが、引用符なしで単純にそうであることが必要n_distinctdplyr機能ということですna.rm=TRUEと答えてください(私がn_distinct(x[y], na.rm=TRUE)を使用しても、NA値なしの結果は得られません)。だから私は両方の関数を渡す引数のyの良い形を持つ解決策を見つける方法を知らない。私はnames()機能のために\"を使用しようとしましたが、動作していないようです。ここで私は取得エラー:

myfun <- function(x, y) summarise(x, var=names(x[y]), n=sum(!is.na(y)), blank=n()-sum(!is.na(y)), distinct=n_distinct(y, na.rm=TRUE)) 
myfun(mtcars, "cyl") 

エラー:Error in summarise_impl(.data, dots) : variable 'y' not found

myfun <- function(x, y) summarise(x, var=names(x[y]), n=sum(!is.na(y)), blank=n()-sum(!is.na(y)), distinct=n_distinct(y, na.rm=TRUE)) 
myfun(mtcars, cyl) 

エラー:Error in summarise_impl(.data, dots) : Evaluation error: object 'cyl' not found.

myfun <- function(x, y) summarise(x, var=names(x[y]), n=sum(!is.na(x[y])), blank=n()-sum(!is.na(x[y])), distinct=n_distinct(x[y], na.rm=TRUE)) 
myfun(mtcars, "cyl") 

エラーはありませんが、見られることをna.rm=TRUEいないようです。

私の目標は、私のデータフレームの各変数に対して1つの行を持つテーブルを作成するためにいくつかのループを持つリンゴになり、1つのテーブル内のすべての変数に対してこれらの情報を持たせることができます。

私は、最小限の再現性の例作ってみました:

library(dplyr) 
myfun <- function(x, y) summarise(x, var=names(x[, y]), n=sum(!is.na(x[, y])), blank=n()-sum(!is.na(x[, y])), n_distinct=n_distinct(x[, y], na.rm=TRUE)) 
a <- mtcars%>% 
    summarise(n=sum(!is.na(cyl)), blank=n()-sum(!is.na(cyl)), n_distinct=n_distinct(cyl, na.rm=TRUE)) 
a <- lapply(colnames(mtcars), function(x) data.frame(bind_rows(a, myfun(mtcars, x)))) 
a <- data.frame(bind_rows(a, myfun(mtcars, "cyl"))) 
a <- a%>% 
    filter(!is.na(var))%>% 
    distinct(var, .keep_all=TRUE) 

しかし、(少なくとも私にとっては)いくつかの不可解な理由のために、それは(ラインa <- lapply(colnames(mtcars), function(x) data.frame(bind_rows(a, myfun(mtcars, x))))、エラーメッセージError in summarise_impl(.data, dots) : Column VAR is of unsupported type NULL)が動作しませんが。それは私のデータフレームでうまく動作し、私はそれをサブセット化し、それはまだうまくいきました。同じクラスの同じ値を手書きで手作業で作成しましたが、うまくいきませんでした...だから、なぜ私のデータセットには効果があるのか​​分かりません。なぜなら、私はRで新しいので、この言語コードに関する講義をしなくても、実際に何をしているのか分かりませんが、 (私のために上記のコードのような)作品は、その後、これ以上...

だから、このコードは私のためにかなり良い作品私はn_distinct(x[, y])を使用しているため、それは私が理解できない何na.rm=TRUEを、無視することを言ったように、ただ問題があります。

申し訳ありませんが私は思っていましたが、私はあなたがそれを明確にする方法についてコメントを残して編集してうれしいです。私は単に私の試練で完全に失われており、物事をより明確に提示する方法は知られていません。助けをありがとう、混乱のためにごめんなさい

答えて

1

私はあなたが何をしようとしているかについて完全にはっきりしていませんが、これはそれを得るかもしれません。

まず、各列に対して実行される関数を作成します。

fn <- function(x){ 
    a = levels(x) 
    n = n=sum(!is.na(x)) 
    blank = length(x) - sum(!is.na(x)) 
    dist = length(unique(x)) 
    c(column = a, n=n, blank=blank, distinct=dist) 
} 

次に、関数applyを使用してdata.frameの各列に関数を適用します。私は行を提供するためにそれを転置しました。

t(apply(mtcars, 2, fn)) 
+0

ありがとうございました!それは仕事をした! n_distinct(x、na.rm = TRUE)で長さ(ユニーク(x))を変更しなければならなかった。どうもありがとう! – GaryDe

関連する問題