r-使用数据读取特定的非连续行.table::fread(相当于"Select"参数,但适用于行)



fread函数(data.table(允许用户使用"select"参数定义要读入的数据帧的特定列(例如fread(input,select=c(1,5,10((。我想要同样的功能,但对于行(例如fread(input,selectrows=c(1,4,47((。我可以在读取文件后这样做,但这需要很长时间,我希望通过只读取我需要的行来优化过程。

我知道有很多基于"文件内"标准以编程方式选择行的选项:

使用数据读取包含选定行的csv文件。table';s fread

读取CSV 行子集的最快方法

但我希望能够使用基于要读入的给定文件之外的标准定义的向量(如本问题中所述,但具体使用fread(。

一种方法(尽管有点暴力(是使用sed来切割线条。

回想一下,freadfile=cmd=,就像中一样

library(data.table)
fwrite(iris, "iris.csv")
fread(cmd = "head -n 3 iris.csv")
#    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1:          5.1         3.5          1.4         0.2  setosa
# 2:          4.9         3.0          1.4         0.2  setosa

(两行,因为head不知道/不关心标题行。(

试试这个:

want_rows <- c(1, 3, 147:149)
# due to the header row, add the header and 1 to each of want
paste0(c(1, 1+want_rows), "p")
# [1] "1p"   "2p"   "4p"   "148p" "149p" "150p"
writeLines(paste0(c(1, 1+want_rows), "p"), "commands.sed")
fread(cmd = "sed -n -f commands.sed iris.csv")
#    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
# 1:          5.1         3.5          1.4         0.2    setosa
# 2:          4.7         3.2          1.3         0.2    setosa
# 3:          6.3         2.5          5.0         1.9 virginica
# 4:          6.5         3.0          5.2         2.0 virginica
# 5:          6.2         3.4          5.4         2.3 virginica
iris[want_rows,]
#     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
# 1            5.1         3.5          1.4         0.2    setosa
# 3            4.7         3.2          1.3         0.2    setosa
# 147          6.3         2.5          5.0         1.9 virginica
# 148          6.5         3.0          5.2         2.0 virginica
# 149          6.2         3.4          5.4         2.3 virginica

如果您有显著的"范围",那么您可以对sed进行一点优化,以使sed -ne '1p;2p;4p;148,150p'的命令行具有相同的效果。

这里列出了另一种方法ala"每隔这么多行":https://www.thegeekstuff.com/2009/09/unix-sed-tutorial-printing-file-lines-using-address-and-patterns/.我不知道你能控制得有多紧(例如,从某个任意数字开始的每一行n(。我不知道这是你的意图还是需要,不过,听起来会有任意的行号。

最新更新