簡體   English   中英

如何將自定義函數應用於我的數據框的每一列

[英]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,請將其包裝在listunnest

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM