[英]How to apply a custom function to each column of my dataframe
我試圖了解tidyverse和dplyr方法,並希望將以下函數應用於dataframe / datatable的每一列:
library(multimode)
funx <- function(x) {multimode::modetest(x, method = 'SI') }
然后嘗試使用像summarize_all這樣的東西開始,但我立刻得到一個錯誤:
錯誤:列
mpg
必須是長度1(匯總值),而不是8
library(dplyr)
mtcars %>%
summarise_all(funx)
我希望直到結束是一個新的數據框顯示在第1列測試colnames,和的p值modetest
列2
從昨天(23-05-2019)更新包后,我的解決方案無法正常工作,以下代碼現在打印'。' 點而不是列名提交了一個帖子到github頁面詢問這個變化的原因: github
library(multimode)
funx <- function(x) {
print(substitute(x))
multires <- multimode::modetest(x, method = 'SI')
p <- multires$p.value}
mtcars %>%
select(1:2) %>%
summarise_all(list(~ funx(.)))
更新具有諷刺意味的是,在獲得github帖子的反饋后,我們現在可以使用新版本執行此操作:
mtcars %>%
select(1:2) %>%
summarise_all(funx)
正如您所看到的,這與我在發布此問題時遇到的問題完全相同。 所以,dplyr團隊的優秀工作使我的語法更加“自然”。
summarise
只能輸出一個元素。 根據?summarise
創建一個或多個標量變量,匯總現有tbl的變量。 使用group_by()創建的組的tbls將在每個組的輸出中生成一行。 沒有組的Tbls將導致一行。
因此,如果輸出超過長度1,請將其包裝在list
並unnest
library(dplyr)
out <- mtcars %>%
summarise_all(list(~ list(funx(.))))
如果我們提取單個值,例如p.value
,則無需將其包裝在list
out1 <- mtcars %>%
select(1:2) %>%
summarise_all(list(~ funx(.)$p.value))
out1
# mpg cyl
#1 0.718 0.244
可以使用gather
將其轉換為兩列數據gather
library(tidyr)
gather(out1, colName, pvalue) %>%
arrange(pvalue)
通過檢查modetest
上的modetest
輸出
funx(mtcars[[1]])
# Silverman (1981) critical bandwidth test
#data: x
#Critical bandwidth = 2.5413, p-value = 0.716
#alternative hypothesis: true number of modes is greater than 1
它不是單個值輸出,而是摘要模型輸出。 因此,最好存儲在list
,但是,我們可以提取特定組件( p-value
)並將其輸出為summarise
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.