簡體   English   中英

lapply函數,帶有dataframe和variable的參數

[英]lapply function with arguments for dataframe and variable

我有一個自定義函數,它總結了一個變量。 我簡化了函數來說明我的問題,即它比下面顯示的更復雜。 請注意,函數的一般結構應該保持不變:它需要一個參數來指定要處理的數據幀( df ),以及一個參數,該變量要匯總( variable_to_test )。

my_fun <- function(df, variable_to_test) {

  variable_to_test <- enquo(variable_to_test)
  new_var_name <- paste0(quo_name(variable_to_test), "_new_name")

  df %>% 
    summarise(
      !!new_var_name := sum(!!variable_to_test, na.rm = TRUE)
    ) 
}

使用一個例子,我可以在我的數據幀中的每個變量上應用該函數:

library(tidyverse)
dat <- tibble(
  variable_1 = c(1:5, NA, NA, NA, NA, NA),
  variable_2 = c(NA, NA, NA, NA, NA, 11:15)
)


> my_fun(dat, variable_1)
# A tibble: 1 x 1
   variable_1_new_name
                 <int>
1                  15


> my_fun(dat, variable_2)
# A tibble: 1 x 1
  variable_2_new_name
                <int>
1                  65

但是:我如何列出在數據框中的所有列上應用該函數? 我試過了

> dat %>%
+ lapply(., my_fun)
Error in duplicate(quo) : argument "quo" is missing, with no default
Called from: duplicate(quo)

但這會返回錯誤。 我正在努力解決這個問題:該函數為數據幀的工作和變量進行了總結。 請注意,我希望保留這種結構 - 我發現將數據框的名稱傳遞給函數更為優雅,而不是僅僅為函數提供變量名稱並將數據框“硬編碼”到函數體中。 有沒有人知道如何lapply()函數?

哦,我認為你只是映射錯誤的東西。 對於tidyverse解決方案,我會嘗試:

map(dat, ~my_fun(dat, .))

這樣做是映射列名稱並將列插入到.

你的工作水平不對。 如果在數據框上映射函數,則此函數應采用 這里的問題是函數my_fun()需要數據框而不是列。

您需要找到解決問題的其他方法。 一種解決方案是使用dplyr提供的映射器:

dat %>%
  summarise_all(sum, na.rm = TRUE) %>%
  rename_all(paste0, "_new_name")

您可以等效地使用purrr中map()set_names()的組合。

dat %>%
  map_df(sum, na.rm = TRUE) %>%
  set_names(paste0, "_new_name")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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