r - 跳过错误错误:无法对不存在的列进行子集化 - 在循环中
问题描述
我正在运行一个循环来读取我计算机中的许多 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.
这是有道理的,因为并非所有数据帧都有那些额外的不需要的列,但问题是这个错误打破了我的循环并停止了它。
我能做些什么?谢谢!
解决方案
您可以使用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)))
推荐阅读
- java - Java 递归 - 基于子属性捕获父类别
- python - 使用数据框绘制子图
- linux - 如果命令超过 1 行,如何在 shell 或 bash 中输入新行/移动到下一行而不执行命令?
- linux - 如何解冻用户的内存限制?
- reactjs - 美人鱼类图的自定义箭头
- mysql - 警告 1261 第 n 行不包含所有列的数据
- node.js - selenium web 驱动是否支持 Node.js 和 Vue.js?
- reactjs - 使用 Storybook 在 React 和纯 HTML/CSS 中显示 React 组件
- c++ - 两个随机访问迭代器上的随机访问迭代器
- c++ - 为什么 StringCopyFromLiteral 比 StringCopyFromString 快?