如何将数据导入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中的内容。