2017-08-12 15 views
0

我想創建一個自定義函數,將應用在一個循環中,給我一張表,包含我需要的所有信息我的表的所有變量。我的功能是基於dplyr函數和baseR自定義函數適用於數據框中的所有變量

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(變量名)用引號引起來,而只dplyr功能n_distinct需要簡單地這麼不帶引號給予正確回答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似乎並不待觀察。

然後,我的目標是蘋果的一些循環,爲我的數據框中的每個變量創建一行,然後可以導出的表中只有一個表中包含所有變量的這些信息。

我試圖讓一個最小的可重複的例子:

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變種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)改變長度(unique(x)),因爲否則它會將我的NA值計算爲一個值,我沒有這麼做。非常感謝! – GaryDe

相關問題