簡體   English   中英

在兩個數據幀列表之間應用 function

[英]Apply a function between two lists of data frames

我有以下數據示例和代碼:

lt1 <- list(df1 <- data.frame(V1 = c("a", "b"),
                              V2 = c("b", "c"),
                              V3 = c(1, 2)),
            df2 <- data.frame(V1 = c("x", "y"),
                              V2 = c("x", "z"),
                              V3 = c(1, 2)))
lvls_func <- function(x) {
  x[1:2] %>% 
    unlist() %>% 
    unique() %>% 
    sort()
  } 
lt_lvls <- lapply(lt1, lvls_func)


complete_func <- function(x) {
  tidyr::complete(x[1] = factor(x[1], levels = lt_lvls),
                  x[2] = factor(x[2], levels = lt_lvls),
                  x[3] = x[3],
                  fill = list(x[3] = 0))
  }

lt1_final <- lapply(lt1, complete_func)

我很難構建我的complete_func()

運行complete_func()時出現此錯誤

Error: unexpected '=' in:
"complete_func <- function(x) {
  tidyr::complete(x[1] ="

在我的最終列表lt1_final中,我期望這個 output:

lt1_final <- list(df1 <- data.frame(V1 = c("a", "b", "a", "a", "b", "b", "c", "c", "c"),
                                    V2 = c("b", "c", "a", "c", "b", "a", "a", "b", "c"),
                                    V3 = c(1, 2, 0, 0, 0, 0, 0, 0, 0)),
                  df2 <- data.frame(V1 = c("x", "y", "x", "x", "y", "y", "z", "z", "z"),
                                    V2 = c("x", "z", "y", "z", "y", "x", "z", "x", "y"),
                                    V3 = c(1, 2, 0, 0, 0, 0, 0, 0, 0)))

謝謝大家的幫助

由於lt_lvls是一個級別列表,我們可能需要Map (來自base R )或使用purrr::map2

此外,通過使用 cross 創建across function有多個變化

  1. 在 function 中添加一個參數lvls
  2. acrossmutate中循環將第 1 列到第 2 列轉換為factor ,指定lvls
  3. 使用拼接( !!! )(或可以使用invoke/exec )對數據子集應用complete ,並使用dplyr::lstfill指定為命名列表(或使用setNames的常規list
library(dplyr)
library(tidyr)
library(purrr)
complete_func <- function(x, lvls) {
  x %>%
     dplyr::mutate(across(1:2, factor, levels =lvls)) %>%
     tidyr::complete(!!! .[1:2], fill = dplyr::lst(!! names(.)[3] := 0)) %>%
     arrange(across(3, ~ .x == 0))
     }

-測試

map2(lt1, lt_lvls, ~ complete_func(.x, .y))
[[1]]
# A tibble: 9 × 3
  V1    V2       V3
  <fct> <fct> <dbl>
1 a     b         1
2 b     c         2
3 a     a         0
4 a     c         0
5 b     a         0
6 b     b         0
7 c     a         0
8 c     b         0
9 c     c         0

[[2]]
# A tibble: 9 × 3
  V1    V2       V3
  <fct> <fct> <dbl>
1 x     x         1
2 y     z         2
3 x     y         0
4 x     z         0
5 y     x         0
6 y     y         0
7 z     x         0
8 z     y         0
9 z     z         0

暫無
暫無

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

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