Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果purrr语言中不存在列,则添加该列_R_Dplyr_Purrr_Tibble - Fatal编程技术网

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

如果purrr语言中不存在列,则添加该列,r,dplyr,purrr,tibble,R,Dplyr,Purrr,Tibble,我一直在努力尝试添加一个新的专栏,如果它不存在的话。我在这里找到了答案: 然而,在我的问题中,我必须在purrr环境中使用它。我试图修改上述答案,但它不符合我的需要 下面是我正在处理的一个示例: 假设我有两个数据帧的列表: 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: col

我一直在努力尝试添加一个新的专栏,如果它不存在的话。我在这里找到了答案:

然而,在我的问题中,我必须在
purrr
环境中使用它。我试图修改上述答案,但它不符合我的需要

下面是我正在处理的一个示例:

假设我有两个
数据帧的列表:

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
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
我尝试使用
purr
复制它(我不喜欢使用for循环):

但输出与单独执行不同

注意:这是我真正问题的一个例子。事实上,我正在使用
purr
读取许多*.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(.)])
  )
re_文件%
映射(函数(文件名){遍历每个文件名
读取csv(文件=paste0(目录路径,“/”,文件名),跳过=2)
}) %>% 
purrr::map(
~dplyr::select(,-以(“文本框”)开头)%>%
~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
dt\u列表%>%
purrr::map(
~tibble::在%names(.)中添加列(!!!cols[!names(cols)%
)
#[[1]]
#一个tibble:5x4
#x y z w
#     
#1 12 NA
#2 1 2 NA
#3 3 1 2 NA
#4 4 1 2 NA
#55112NA
#[[2]]
#一个tibble:5x4
#x y z w
#     
#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

purrr::map(dtu列表,函数(x){x$w)昨天我发现缺少点“.”作为
add_column()
中的第一个参数是问题所在(正如我在使用
dply::select()
时所做的那样);正如你在回答中所建议的那样(顺便说一下,非常感谢)。但我仍然不知道为什么点(.)是否需要?使用
purrr:map()
时,代码是否应该已经知道它正在使用数据帧?
?TIBLE::add_column
需要一个数据帧作为第一个参数,并且需要显式传递它。使用
map
可以使用
.x
。两者的工作原理相同。
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