繁体   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