我想創建一個自定義函數,將應用在一個循環中,給我一張表,包含我需要的所有信息我的表的所有變量。我的功能是基於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(變量名)用引號引起來,而只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
,我無法理解。
對不起,我問了一個相當不太完善的問題,我想我會很高興編輯它,如果你留下評論關於如何澄清它。我完全迷失了我的嘗試,並不知道如何以更清晰的方式呈現事物。感謝您的幫助和對不起的混亂
非常感謝!它完成了這項工作!我只需要用n_distinct(x,na.rm = TRUE)改變長度(unique(x)),因爲否則它會將我的NA值計算爲一個值,我沒有這麼做。非常感謝! – GaryDe