如果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