首页 > 解决方案 > 跳过错误错误:无法对不存在的列进行子集化 - 在循环中

问题描述

我正在运行一个循环来读取我计算机中的许多 txt 文件,并且我愿意将它们全部合并到一个大数据框中。

listofdf <- list()

for (i in 1:5) {
    temp_data <- read_delim(files_to_read[i], delim = "\t")

temp_data <- temp_data %>%
    select(!c("Analysis.Index", "Participant.Name", "Identity", "Landmarks"))

  listofdf[[i]] <- temp_data
}

我的问题是其中一些数据框有列而其他没有 - 这意味着我无法使用该功能

 do.call(rbind,listofdf)

将它们全部合并。

当我尝试在循环中使用“选择”时,我得到了错误:

Error: Can't subset columns that don't exist.

x Column `Analysis.Index` doesn't exist.

这是有道理的,因为并非所有数据帧都有那些额外的不需要的列,但问题是这个错误打破了我的循环并停止了它。

我能做些什么?谢谢!

标签: rdplyrtidyverse

解决方案


您可以使用any_of,它仅选择/删除数据中存在的那些列并忽略不存在的列。例如,使用mtcars数据集:

library(tidyverse)

mtcars %>% select(any_of(c('mpg', 'mpg1')))

#                     mpg
#Mazda RX4           21.0
#Mazda RX4 Wag       21.0
#Datsun 710          22.8
#Hornet 4 Drive      21.4
#...
#...

用于map_df组合files_to_read在一个数据框中。

cols <- c("Analysis.Index", "Participant.Name", "Identity", "Landmarks")
combine_data <- map_df(files_to_read, 
                  ~read_delim(.x, delim = "\t") %>% select(!any_of(cols)))

推荐阅读