如何从文件中只读取选定的列到R中?(在`read.table`和`scan`之间找到一个平衡点?)
问题的出现原因:
- `read.table`和`scan`函数在读取大型文件时速度较慢,不够高效。
- 需要从文件中选择性地读取特定列的数据。
解决方法:
- 使用`sqldf()`包将数据加载到sqlite中,然后从中提取所需的数据。
- `sqldf()`包提供了简单的操作方法,可以方便地从sqlite中提取特定列的数据。
在R中只读取选择列的方法是什么?(介于`read.table`和`scan`之间的一种折中方案)
我认为Dirk的方法既简单又快速。我使用的另一种方法是将数据加载到sqlite中,这比`read.table()`快得多,然后只提取你想要的内容。`sqldf()`包使这一切变得非常容易。下面是一个链接,提供了关于`sqldf()`的代码示例。
在R中,有时我会使用以下方法来读取一个制表符分隔的文件中的数据:
df <- read.table(pipe("cut -f1,5,28 myFile.txt"))
这样可以让`cut`命令进行数据选择,而且它可以在几乎不使用内存的情况下完成。在这里,我们可以使用`cut`命令来选择数据,因为它不需要使用太多的内存。
另外,也有一种纯R版本的解决方法,可以在`read.table`的`colClasses`参数中使用`"NULL"`来只读取特定的列。可以参考Only read limited number of columns。
在一些情况下,我会使用第一个例子中的方法,这种方法非常接近我最终使用的方法。(在我的情况下,由于文件格式不规则,我使用了awk而不是cut命令)。而第二个例子并不完全等同于第一个例子,因为它会创建整个数据框,然后再将其丢弃。当我从一个拥有百万行数据的文件中只想读取10列中的2列时,这会对性能产生很大的影响。
实际上,纯R版本的方法应该是这样的(假设有28列):
mycols <- rep(NULL, 28) mycols[c(1,5,28)] <- NA df <- read.table(file, colClasses=mycols)
我刚巧看到了这个问题。看起来,`NULL`需要用引号括起来。
我喜欢提供的解决方案,然而对于`mycols <- rep("NULL", 28)`这种情况,我必须将`NULL`用引号括起来。
如果文件名是存储在R变量中的(因此无法使用固定的"myFile.txt"),该怎么办呢?
在's'的评论中,您可以使用`read.csv`来完成相同的操作:
df <- read.csv(file, colClasses=mycols)
我正在尝试使用`read.table`仅读取列名也包含在向量`labels <- c("a", "b","c"...)`中的向量。我的问题是,我正在读取多个`.txt`文件,并且每个文件中都有向量中的一些标签。是否有一种方法可以使用`read.table`和`%in%`运算符来仅读取与每个`.txt`文件中匹配的标签?
R中读取文件的方法有很多种,但是在读取文件时,有时我们只需要选择其中的某些列。这就引发了如何从文件中只读取特定列的问题。下面将介绍这个问题出现的原因以及解决方法。
问题的出现原因是在R中读取文件时,常见的方法有两种:`read.table`和`scan`。但是这两种方法都没有直接支持只读取特定列的功能。因此,我们需要找到一种介于这两种方法之间的解决方案。
解决方法之一是使用`pipe()`函数代替文件名,然后使用类似于`awk`的过滤器从中提取出我们想要的列。具体来说,可以使用`awk`命令来实现这个功能。`pipe()`函数可以将命令行命令作为参数传递给R,并将其结果作为输入数据。通过使用`awk`命令,我们可以在R中读取到我们想要的特定列。
另一种解决方法是使用`read.table()`函数,并在`colClasses`参数中明确指定需要的列。当某一列的`colClasses`的值为NULL时,`read.table()`函数会跳过该列。因此,通过在`colClasses`参数中逐列设置值,我们可以只读取需要的列。
在R中只读取特定列的方法有两种。一种是使用`pipe()`函数和类似于`awk`的过滤器,另一种是使用`read.table()`函数并在`colClasses`参数中明确指定需要的列。这两种方法都是在基本的R环境下实现的,不需要额外的包或工具。