R语言选择导入文本数据部分字段
来源:互联网 发布:雅马哈授权网络经销商 编辑:程序博客网 时间:2024/06/11 06:10
背景:文本数据字段太多,只需要读取有用字段,以此降低内存压力方便分析
参考:Only read limited number of columns in R
方法一:read.table、read.csv
直接使用自带函数设定适当的参数(colClasses),该参数需要指定每列数据的类型(可以使用nrows参数读取几行查看class),不需要的列指定为NULL即可。如下:
<span style="font-family:Courier New;font-size:14px;">dat <- structure(list(Year = 2009:2011, Jan = c(-41L, -41L, -21L), Feb = c(-27L, -27L, -27L), Mar = c(-25L, -25L, -2L), Apr = c(-31L, -31L, -6L), May = c(-31L, -31L, -10L), Jun = c(-39L, -39L, -32L), Jul = c(-25L, -25L, -13L), Aug = c(-15L, -15L, -12L), Sep = c(-30L, -30L, -27L), Oct = c(-27L, -27L, -30L), Nov = c(-21L, -21L, -38L), Dec = c(-25L, -25L, -29L)), .Names = c("Year", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"), class = "data.frame", row.names = c(NA, -3L))write.table(dat, "test.txt", row.names=FALSE)## 查看每个列的classdf <- read.table("test.txt", nrow=2, header = TRUE)apply(df, 2, class)# Year Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec # "integer" "integer" "integer" "integer" "integer" "integer" "integer" "integer" "integer" "integer" "integer" "integer" "integer"df <- read.table("test.txt", colClasses = c(rep("integer", 7), rep("NULL", 6)), header = TRUE)# > df# Year Jan Feb Mar Apr May Jun# 1 2009 -41 -27 -25 -31 -31 -39# 2 2010 -41 -27 -25 -31 -31 -39# 3 2011 -21 -27 -2 -6 -10 -32write.csv(dat, "test.csv", row.names=FALSE)df <- read.csv("test.csv", colClasses = c(rep("integer", 7), rep("NULL", 6)), header = TRUE)# > df# Year Jan Feb Mar Apr May Jun# 1 2009 -41 -27 -25 -31 -31 -39# 2 2010 -41 -27 -25 -31 -31 -39# 3 2011 -21 -27 -2 -6 -10 -32 </span>
方法二:使用package:colbycol
colbycol
没有安装成功,好像也不怎么支持了
方法三:使用package数据库功能辅助(RJDBC)
实际就是用Java来解决这个问题,太复杂没有去实现
<span style="font-family:Courier New;">library(RJDBC)write.table(x=mtcars, file="mtcars.csv", sep=",", row.names=F, col.names=T)path.to.jdbc.driver <- "jdbc//csvjdbc-1.0-18.jar"drv <- JDBC("org.relique.jdbc.csv.CsvDriver", path.to.jdbc.driver)conn <- dbConnect(drv, sprintf("jdbc:relique:csv:%s", getwd()))head(dbGetQuery(conn, "select * from mtcars"), 3)# mpg cyl disp hp drat wt qsec vs am gear carb# 1 21 6 160 110 3.9 2.62 16.46 0 1 4 4# 2 21 6 160 110 3.9 2.875 17.02 0 1 4 4# 3 22.8 4 108 93 3.85 2.32 18.61 1 1 4 1head(dbGetQuery(conn, "select mpg, gear from mtcars"), 3)</span>
方法四:借助linux工具命令实现
快速,方便;需要熟悉awk,cut的语法
cut功能比较单一适合处理分割整齐的数据,而awk的功能更加强大(awk使用1,awk使用2)
<span style="font-family:Courier New;font-size:14px;">dat <- structure(list(Year = 2009:2011, Jan = c(-41L, -41L, -21L), Feb = c(-27L, -27L, -27L), Mar = c(-25L, -25L, -2L), Apr = c(-31L, -31L, -6L), May = c(-31L, -31L, -10L), Jun = c(-39L, -39L, -32L), Jul = c(-25L, -25L, -13L), Aug = c(-15L, -15L, -12L), Sep = c(-30L, -30L, -27L), Oct = c(-27L, -27L, -30L), Nov = c(-21L, -21L, -38L), Dec = c(-25L, -25L, -29L)), .Names = c("Year", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"), class = "data.frame", row.names = c(NA, -3L))# 使用制表符分割write.table(dat, "test.txt", row.names=FALSE, sep = "\t")df <- read.table(pipe("cut -f 1,5 test.txt"), header=TRUE)dfsystem("cut -f 1,5 test.txt")# Year Apr# 1 2009 -31# 2 2010 -31# 3 2011 -6# 使用空格分割write.table(dat, "test.txt", row.names=FALSE, sep = " ")df <- read.table(pipe("cut -d ' ' -f 1,5 test.txt"), header=TRUE)dfsystem("cut -d ' ' -f 1,5 test.txt")# Year Apr# 1 2009 -31# 2 2010 -31# 3 2011 -6</span>
总结
(1)数据量不是很大且对数据内容了解时,可以使用read.table指定合理的参数colClasses读取。
(2)数据较大且要求速度建议借助linux下的数据处理工具
1 0
- R语言选择导入文本数据部分字段
- R语言数据导入
- R语言数据导入
- R语言读入文本数据
- R语言---数据导入方式
- R语言如何导入数据
- 【R语言】基础数据导入
- R语言导入EXCEL数据
- R语言的数据导入与导出
- R语言数据的导入与导出
- R语言如何 将数据导出、导入
- R语言数据导入和数据库操作
- 关于R语言的数据导入
- R语言学习-数据导入数据库-MYSQL
- R语言-数据操作之选择
- js选择部分文本
- Bulk insert如何导入部分字段的数据
- R语言-文本分析
- Git push 总结
- 区间第K大数
- Spring学习 RMI
- 【JSP开发】JSP常用标签介绍
- 图---邻接表(建立,深度遍历,广度遍历)
- R语言选择导入文本数据部分字段
- 把TextView中的文字添加阴影效果及Style的使用
- mysql 搜索当天数据
- html5 canvas 详细使用教程
- bool? 什么意思 bool? isTrue;表示 bool isTrue = null ; 定义并给变量赋值为null;
- SVN应用
- 数据库Oracle DB2 MySQL 分页
- 树莓派与Arduino的串口通信
- editext文本输入框 软键盘下个按钮的问题