【问题标题】:Specify the number of columns read_csv is applied to指定 read_csv 应用于的列数
【发布时间】:2020-01-28 03:31:54
【问题描述】:

是否可以将列索引传递给 read_csv?

我将许多 CSV 文件传递​​给具有不同标题名称的 read_csv,因此我希望使用列索引而不是指定名称。

这可能吗?

df.list <- lapply(myExcelCSV, read_csv, skip = headers2skip[i]-1)

【问题讨论】:

  • 我很想将“索引”编辑为“索引”,但会避免......

标签: r dplyr lapply


【解决方案1】:

或者,您可以使用紧凑的字符串表示 其中每个字符代表一列: c = character, i = 整数,n = 数字,d = 双精度,l = 逻辑,f = 因子,D = 日期,T = 日期时间,t = 时间,? = 猜测,或‘_’/‘-’ 跳过该列。

如果您知道文件中的 total 列数,您可以这样做:

my_read <- function(..., tot_cols, skip_cols=numeric(0)) {
   csr <- rep("?",tot_cols)
   csr[skip_cols]  <- "_"
   csr <- paste(csr,collapse="")
   read_csv(...,col_types=csr)
}

如果您事先不知道总列数,您可以在此函数中添加代码以仅读取文件的第一行并计算返回的列数...

FWIW skip 参数可能不会像您认为的那样做(它跳过行而不是选择/取消选择列):正如我所读 ?readr::read_csv() 似乎没有任何方便的方法来跳过和/或包括特定的列(按名称或按索引),除了上面建议的某些 ad hoc 机制;这可能值得在readr 问题列表上提出功能请求/讨论? (例如,添加可以通过名称或位置指定的 cols_include 和/或 cols_exclude 参数?)

【讨论】:

  • 可能需要scan (what=character(), sep=[something]),因为count.fields() 似乎没有n_max 参数?或者readLines(n=1) 传递给count.fields()
  • 嗨@Ben Bolker,感谢您的回复。我确实知道我希望读入多少列(所有文件为 10 列),但在 16 个文件之一中,read_csv 拉入 13 列,即使显然有 10 列数据。我认为文件中一定有一些虚假数据导致混淆。
猜你喜欢
  • 2019-09-02
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
  • 2022-01-09
  • 2017-02-22
  • 2015-09-03
  • 1970-01-01
相关资源
最近更新 更多