【问题标题】:skipping error Error: Can't subset columns that don't exist - in a loop跳过错误错误:无法对不存在的列进行子集化 - 在循环中
【发布时间】:2021-02-26 08:55:38
【问题描述】:

我正在运行一个循环来读取我计算机中的许多 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.

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

我能做什么?谢谢!

【问题讨论】:

  • 尝试data.table::rbindlist(lapply(files_to_read, data.table::fread), use.names=TRUE, fill = TRUE) 获取一个包含所有文件的大型data.table,然后是子集。

标签: r dplyr tidyverse


【解决方案1】:

您可以使用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_dffiles_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)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    相关资源
    最近更新 更多