如果 purrr 语言中不存在则添加列

Adding column if it does not exist inside purrr language

如果新列不存在,我一直在努力尝试添加它。我在这里找到了答案: .

但是,在我的问题中,我必须在 purrr 环境中使用它。我试着改编了上面的答案,但它不符合我的需要。

这是我正在处理的一个例子:

假设我有一个包含两个 data.frames:

的列表
library(tibble)

A = tibble(
  x = 1:5, y = 1, z = 2
)

B = tibble(
  x = 5:1, y = 3, z = 3, w = 7
)

dt_list = list(A, B)

我要添加的列是 w:

cols = c(w = NA_real_)

另外,如果我想添加一个不存在的列,我可以执行以下操作:

因为它确实存在,所以不添加列:

B %>% tibble::add_column(!!!cols[!names(cols) %in% names(.)])

# A tibble: 5 x 4
      x     y     z     w
  <int> <dbl> <dbl> <dbl>
1     5     3     3     7
2     4     3     3     7
3     3     3     3     7
4     2     3     3     7
5     1     3     3     7

本例中,由于不存在,所以添加w

A %>% tibble::add_column(!!!cols[!names(cols) %in% names(.)])

# A tibble: 5 x 4
      x     y     z     w
  <int> <dbl> <dbl> <dbl>
1     1     1     2    NA
2     2     1     2    NA
3     3     1     2    NA
4     4     1     2    NA
5     5     1     2    NA

我尝试了以下方法来使用 purrr 复制它(我不想使用 for 循环):

dt_list_2 = dt_list %>% 
  purrr::map(
    ~dplyr::select(., -starts_with("x")) %>% 
      ~tibble::add_column(!!!cols[!names(cols) %in% names(.)])
  )

但是输出结果和单独做是不一样的。

注:这是我真实问题的一个例子。事实上,我正在使用 purrr 读取许多 *.csv 文件,然后应用一些数据转换。像这样:

re_file <- list.files(path = dir_path, pattern = "*.csv")

cols_add = c(UCI = NA_real_)

file_list = re_file %>%
  purrr::map(function(file_name){ # iterate through each file name
    
    read_csv(file = paste0(dir_path, "//",file_name), skip = 2)
  }) %>% 
   purrr::map(
     ~dplyr::select(., -starts_with("Textbox")) %>% 
       ~dplyr::tibble(!!!cols[!names(cols) %in% names(.)])
  )

您可以使用:

dt_list %>% 
  purrr::map(
    ~tibble::add_column(., !!!cols[!names(cols) %in% names(.)])
  )

#[[1]]
# A tibble: 5 x 4
#     x     y     z     w
#  <int> <dbl> <dbl> <dbl>
#1     1     1     2    NA
#2     2     1     2    NA
#3     3     1     2    NA
#4     4     1     2    NA
#5     5     1     2    NA

#[[2]]
# A tibble: 5 x 4
#      x     y     z     w
#  <int> <dbl> <dbl> <dbl>
#1     5     3     3     7
#2     4     3     3     7
#3     3     3     3     7
#4     2     3     3     7
#5     1     3     3     7