新浪博客

如何将数据导入R中

2017-03-19 16:03阅读:
有很多种文件类型是用来存储数据的,比较常见的有:文本文件,电子数据表,数据库,其他特殊软件中的形式。一下介绍一本分这类数据导入的方法。 1. 文本文件
许多软件工具都能使用CSV文件存储数据,所以当其他导入数据的方法失败后,这是一种可行的数据源。
以下所使用的R包是:readr。这个包所提供的函数更加稳健,并且更快。并且其常用的返回值是tbl数据框类型的数据。
例如我们有一下数据的 x.csv 文件:
ID, Name, Age
23424, Ana, 45
11234, Charles, 23
77654, Susanne, 76
可以用以下代码读取:
library(readr) dat <- read_csv('x.csv') dat class(dat)
read_csv() 的返回结果是来自 dplyr 包的数据结构。
有些文件使用空格作为分隔符。那么可以使用一些更加通用的函数。如下:
ID Name Age Phone
23424 Ana 40 ???
11234 Charles 12 34567678
77654 Susanne 45 23435567
使用代码:
d <- read_delim('z.txt', delim=' ', na='???') d
上面的.txt文本文件中,是用'???'表示NA值,使用空格表示分隔符,那么就用 read_delim() 中的delim和na参数进行调整即可。
对于特别大的文件,读者们可以查询包data.table中fread()的相关操作,或者包iotools中的read.csv.raw()函数。

2. 从数据库中导入数据
在R中使用包DBI进行从数据库导入会更加方便。下面举出一些从MySQL中获取数据的例子。
library(DBI) ## The DBMS-specific code starts here library(RMySQL) drv <- dbDriver('MySQL') # Loading the MySQL driver con <- dbConnect(drv,dbname='transDB', # connecting to the DBMS username='myuser',password='mypasswd', host='localhost') ## The DBMS-specific code ends here ## getting the results of an SQL query as a data frame data <- dbGetQuery(con,'SELECT * FROM clients') ## closing up stuff dbDisconnect(con) dbUnloadDriver(drv)
在包DBI中最主要的函数是dbGetQuery(),它利用SQL语句从数据库中取出数据并存放到一个data frame中。
有时候一个数据库查询的结果可能非常地大,以至于难以处理,DBI这个包可以让我们一块一块地取出数据,下面是代码的例子。
library(DBI) library(RMySQL) drv <- dbDriver('MySQL') # Loading the MySQL driver con <- dbConnect(drv,dbname='transDB', # connecting to the DBMS username='myuser',password='mypasswd', host='localhost') res <- dbSendQuery(con,'SELECT * FROM transactions') while (!dbHasCompleted(res)) { # get the next 50 records on a data frame someData <- fetch(res, n = 50) # call some function that handles the current chunk myProcessingFunction(someData) } dbClearResult(res) # clear the results set dbDisconnect(con) # closing up stuff dbUnloadDriver(drv)
注意这段代码里我们用到的是dbSendQuary()。
使用包dplyr可以让我们更少地依赖于数据库的返回结果。我们可以将产生的数据转变为tbl类型。
library(RMySQL) library(dplyr) dbConn <- src_mysql('sonae', host='localhost',user='prodUser',password='myPassword')
sensors <- tbl(dbConn,'sensor_values')
sensors %>% filter(sid==274,value > 100) %>% select(time,value)
注意dplyr有几个查询数据集的函数,还可以联接几个数据表(inner,left,right),所以我们在得到数据表的时候不必仅仅局限于来自一个数据表。
3. 从数据表(Spreadsheets)中导入数据
有一个叫做readxl的包,这个包中有一个函数read_excel(),如下代码:
library(readxl) fc <- 'c:\\Documents and Settings\\xpto\\My Documents\\calc.xls' dat <- read_excel(fc,sheet=1)
这其中的参数“sheet = 1”表示从文件中读取第一个sheet中的内容。

我的更多文章

下载客户端阅读体验更佳

APP专享