fread r语言(R 读取表格--读取错误,列名乱码)

本文目录
R 读取表格--读取错误,列名乱码
读取表格 坑1:列名称不对,使用了R不能识别的列名
1 | follow_table 《- read.csv("follow_table.csv", header = T)
返回
follow_table 《- read.csv("follow_table.csv", header = T)
Error in make.names(col.names, unique = TRUE) :
invalid multibyte string 2
返回表格,把列名中含数字的都去掉,改成字母+下划线就好了。
读取表格坑2 :
orignal_table 《- read.csv("original_table.csv",header = T)
Error in read.table(file = file, header = header, sep = sep, quote = quote, :
列的数目比列的名字要多
后来看了,表格为逗号分隔符,加上 sep = "," ,还是没好,把表头 设置成 header = F 就好了
orignal_table 《- read.csv("original_table.csv",sep=",", header = F)
这样读取的表格还是不行,因为第一列的列名为乱码。
***隐藏网址***
原来是因为只是把表格另存为csv是不行了,需要把表格导出为CSV的格式。
两个表格通过同一个列名合并,最终得到的是其同一列名交集的最终对应的变量。
【译文】怎样在R语言中使用SQL命令
(downloader)
library(dplyr)
library(sqldf)
library(data.table)
library(ggplot2)
library(compare)
library(plotrix)
主要的错误处理函数tryCatch()
我们将使用这个函数来处理下载的数据。由于数据以季度频率发布,每年都会有四个观_值(每年有四条记录)。执行这个函数能自己主动下载数据,但假设某些季度数据从网上无法获取(尚未发布)。该函数会返回一条错误信息表示无法找到数据集。
如今让我们下载数据的压缩包并将其解压。
try.error = function(url)
{
try_error = tryCatch(download(url,dest="data.zip"), error=function(e) e)
if (!inherits(try_error, "error")){
download(url,dest="data.zip")
unzip ("data.zip")
}
else if (inherits(try_error, "error")){
cat(url,"not found\n")
}
}
下载不良事件数据
我们能够得到自2004年起的FDA不良事件数据。本文将使用2013年以来发布的数据,我们将检查截至当前时间的最新数据并下载。
》 Sys.time() 函数会返回当前的日期和时间。
》 data.table包中的year()函数会从之前返回的当前时间中提取年份信息。
我们将下载人口、药物、诊断/指示,结果和反应(不良事件)数据。
year_start=2013
year_last=year(Sys.time())
for (i in year_start:year_last){
j=c(1:4)
for (m in j){
***隐藏网址***
***隐藏网址***
***隐藏网址***
***隐藏网址***
***隐藏网址***
try.error(url1)
try.error(url2)
try.error(url3)
try.error(url4)
try.error(url5)
}
}
***隐藏网址***
...
***隐藏网址***
依据上面的错误信息。截至成文时间(2016年3月13日)。我们最多能够获得2015年第三季度的不良事件数据。
》 list.files()函数会字符串向量的形式返回当前工作文件夹下全部文件的名字。
》 我会使用正_表_式对各个数据集的类别进行筛选。
比方^demo.*.csv表示全部名字以demo开头的csv文件。
filenames 《- list.files(pattern="^demo.*.csv", full.names=TRUE)
cat(‘We have downloaded the following quarterly demography datasets‘)
filenames
我们已经下载了下列季度人口数据
"./demo2012q1.csv" "./demo2012q2.csv" "./demo2012q3.csv" "./demo2012q4.csv" "./demo2013q1.csv" "./demo2013q2.csv" "./demo2013q3.csv" "./demo2013q4.csv" "./demo2014q1.csv" "./demo2014q2.csv" "./demo2014q3.csv" "./demo2014q4.csv" "./demo2015q1.csv" "./demo2015q2.csv" "./demo2015q3.csv"
让我们用data.table包中的fread()函数来读入这些数据集,以人口数据为例:
demo=lapply(filenames,fread)
接着让我们把它们转换数据结构并合并成一个数据框:
demo_all=do.call(rbind,lapply(1:length(demo),function(i) select(as.data.frame(demo),primaryid,caseid, age,age_cod,event_dt,sex,reporter_country)))
dim(demo_all)
3554979 7
我们看到人口数据有超过350万行观_(记录)。
译者注:以下的内容都是反复这个流程。能够略过
如今让我们合并全部的药品数据
filenames 《- list.files(pattern="^drug.*.csv", full.names=TRUE)
cat(‘We have downloaded the following quarterly drug datasets:\n‘)
filenames
drug=lapply(filenames,fread)
cat(‘\n‘)
cat(‘Variable names:\n‘)
names(drug)
drug_all=do.call(rbind,lapply(1:length(drug), function(i) select(as.data.frame(drug),primaryid,caseid, drug_seq,drugname,route)))
我们已经下载了下列季度药品数据集
"./drug2012q1.csv" "./drug2012q2.csv" "./drug2012q3.csv" "./drug2012q4.csv" "./drug2013q1.csv" "./drug2013q2.csv" "./drug2013q3.csv" "./drug2013q4.csv" "./drug2014q1.csv" "./drug2014q2.csv" "./drug2014q3.csv" "./drug2014q4.csv" "./drug2015q1.csv" "./drug2015q2.csv" "./drug2015q3.csv"
每张表中的变量名分别为:
"primaryid" "drug_seq" "role_cod" "drugname" "val_vbm" "route" "dose_vbm" "dechal" "rechal" "lot_num" "exp_dt" "exp_dt_num" "nda_num"
合并全部的诊断/指示数据集
filenames 《- list.files(pattern="^indi.*.csv", full.names=TRUE)
cat(‘We have downloaded the following quarterly diagnoses/indications datasets:\n‘)
filenames
indi=lapply(filenames,fread)
cat(‘\n‘)
cat(‘Variable names:\n‘)
names(indi)
indi_all=do.call(rbind,lapply(1:length(indi), function(i) select(as.data.frame(indi),primaryid,caseid, indi_drug_seq,indi_pt)))
已经下载的数据集为:
"./indi2012q1.csv" "./indi2012q2.csv" "./indi2012q3.csv" "./indi2012q4.csv" "./indi2013q1.csv" "./indi2013q2.csv" "./indi2013q3.csv" "./indi2013q4.csv" "./indi2014q1.csv" "./indi2014q2.csv" "./indi2014q3.csv" "./indi2014q4.csv" "./indi2015q1.csv" "./indi2015q2.csv" "./indi2015q3.csv"
变量名为:
"primaryid" "caseid" "indi_drug_seq" "indi_pt"
合并病人的结果数据:
filenames 《- list.files(pattern="^outc.*.csv", full.names=TRUE)
cat(‘We have downloaded the following quarterly patient outcome datasets:\n‘)
filenames
outc_all=lapply(filenames,fread)
cat(‘\n‘)
cat(‘Variable names\n‘)
names(outc_all)
names(outc_all)
colnames(outc_all)=c("primaryid", "caseid", "outc_cod")
outc_all=do.call(rbind,lapply(1:length(outc_all), function(i) select(as.data.frame(outc_all),primaryid,outc_cod)))
下载的数据集例如以下:
"./outc2012q1.csv" "./outc2012q2.csv" "./outc2012q3.csv" "./outc2012q4.csv" "./outc2013q1.csv" "./outc2013q2.csv" "./outc2013q3.csv" "./outc2013q4.csv" "./outc2014q1.csv" "./outc2014q2.csv" "./outc2014q3.csv" "./outc2014q4.csv" "./outc2015q1.csv" "./outc2015q2.csv" "./outc2015q3.csv"
变量名:
"primaryid" "outc_cod"
"primaryid" "caseid" "outc_code"
最后来合并反应(不良事件)数据集(译者注:这部分无聊地我要哭了)
filenames 《- list.files(pattern="^reac.*.csv", full.names=TRUE)
cat(‘We have downloaded the following quarterly reaction (adverse event) datasets:\n‘)
filenames
reac=lapply(filenames,fread)
cat(‘\n‘)
cat(‘Variable names:\n‘)
names(reac)
reac_all=do.call(rbind,lapply(1:length(indi), function(i) select(as.data.frame(reac),primaryid,pt)))
下载的数据集有:
"./reac2012q1.csv" "./reac2012q2.csv" "./reac2012q3.csv" "./reac2012q4.csv" "./reac2013q1.csv" "./reac2013q2.csv" "./reac2013q3.csv" "./reac2013q4.csv" "./reac2014q1.csv" "./reac2014q2.csv" "./reac2014q3.csv" "./reac2014q4.csv" "./reac2015q1.csv" "./reac2015q2.csv" "./reac2015q3.csv"
变量名为:
"primaryid" "pt"
让我们看看不同的数据类型各有多少行
all=as.data.frame(list(Demography=nrow(demo_all),Drug=nrow(drug_all),
Indications=nrow(indi_all),Outcomes=nrow(outc_all),
Reactions=nrow(reac_all)))
row.names(all)=‘Number of rows‘
all
SQL命令
记住sqldf包使用SQLite
COUNT
# SQL版本号
sqldf("SELECT COUNT(primaryid)as ‘Number of rows of Demography data‘
FROM demo_all;")
# R版本号
nrow(demo_all)
3554979
LIMIT命令(显示前几行)
# SQL版本号
sqldf("SELECT *
FROM demo_all
LIMIT 6;")
# R版本号
head(demo_all,6)
R1=head(demo_all,6)
SQL1 =sqldf("SELECT *
FROM demo_all
LIMIT 6;")
all.equal(R1,SQL1)
TRUE
*译者注:这部分代码验证了SQL命令和R代码的等价性,下同。
WHERE命令
SQL2=sqldf("SELECT * FROM demo_all WHERE sex =‘F‘;")
R2 = filter(demo_all, sex=="F")
identical(SQL2, R2)
TRUE
SQL3=sqldf("SELECT * FROM demo_all WHERE age BETWEEN 20 AND 25;")
R3 = filter(demo_all, age 》= 20 & age 《= 25)
identical(SQL3, R3)
TRUE
GROUP BY 和 ORDER BY
# SQL版本号
sqldf("SELECT sex, COUNT(primaryid) as Total
FROM demo_all
WHERE sex IN (‘F‘,‘M‘,‘NS‘,‘UNK‘)
GROUP BY sex
ORDER BY Total DESC ;")
# R版本号
demo_all %》% filter(sex %in%c(‘F‘,‘M‘,‘NS‘,‘UNK‘)) %》% group_by(sex) %》%
summarise(Total = n()) %》% arrange(desc(Total))
SQL3 = sqldf("SELECT sex, COUNT(primaryid) as Total
FROM demo_all
GROUP BY sex
ORDER BY Total DESC ;")
R3 = demo_all%》%group_by(sex) %》%
summarise(Total = n())%》%arrange(desc(Total))
compare(SQL3,R3, allowAll=TRUE)
TRUE
dropped attributes
利用SQL命令进行数据清洗并绘制3D饼图
SQL=sqldf("SELECT sex, COUNT(primaryid) as Total
FROM demo_all
WHERE sex IN (‘F‘,‘M‘,‘NS‘,‘UNK‘)
GROUP BY sex
ORDER BY Total DESC ;")
SQL$Total=as.numeric(SQL$Total
pie3D(SQL$Total, labels = SQL$sex,explode=0.1,col=rainbow(4),
main="Pie Chart of adverse event reports by gender",cex.lab=0.5, cex.axis=0.5, cex.main=1,labelcex=1)
输出的图例如以下:
Inner Join
让我们把药品数据和指数数据基于主id和药品序列内连。
首先。我们要检查下变量名,看看怎样合并两个数据集。
names(indi_all)
names(drug_all)
"primaryid" "indi_drug_seq" "indi_pt"
"primaryid" "drug_seq" "drugname" "route"
names(indi_all)=c("primaryid", "drug_seq", "indi_pt" ) # 使两个数据集变量名一致
R4= merge(drug_all,indi_all, by = intersect(names(drug_all), names(indi_all))) # R版本号合并
R4=arrange(R3, primaryid,drug_seq,drugname,indi_pt) # R版本号排序
SQL4= sqldf("SELECT d.primaryid as primaryid, d.drug_seq as drug_seq, d.drugname as drugname,
d.route as route,i.indi_pt as indi_pt
FROM drug_all d
INNER JOIN indi_all i
ON d.primaryid= i.primaryid AND d.drug_seq=i.drug_seq
ORDER BY primaryid,drug_seq,drugname, i.indi_pt") # SQL版本号
compare(R4,SQL4,allowAll=TRUE)
TRUE # 两种方法等价
R5 = merge(reac_all,outc_all,by=intersect(names(reac_all), names(outc_all)))
SQL5 =reac_outc_new4=sqldf("SELECT r.*, o.outc_cod as outc_cod
FROM reac_all r
INNER JOIN outc_all o
ON r.primaryid=o.primaryid
ORDER BY r.primaryid,r.pt,o.outc_cod")
compare(R5,SQL5,allowAll = TRUE)
TRUE
# 绘制不同性别的年龄概率分布密度图
ggplot(sqldf(‘SELECT age, sex
FROM demo_all
WHERE age between 0 AND 100 AND sex IN ("F","M")
LIMIT 10000;‘), aes(x=age, fill = sex))+ geom_density(alpha = 0.6)
绘制出的图例如以下:
绘制不同结果的年龄年龄概率分布密度图(译者注:后面都是结果的可视化,可略过。原作者的耐心真好。
。
)
ggplot(sqldf("SELECT d.age as age, o.outc_cod as outcome
FROM demo_all d
INNER JOIN outc_all o
ON d.primaryid=o.primaryid
WHERE d.age BETWEEN 20 AND 100
LIMIT 20000;"),aes(x=age, fill = outcome))+ geom_density(alpha = 0.6)
输出例如以下:
ggplot(sqldf("SELECT de.sex as sex, dr.route as route
FROM demo_all de
INNER JOIN drug_all dr
ON de.primaryid=dr.primaryid
WHERE de.sex IN (‘M‘,‘F‘) AND dr.route IN (‘ORAL‘,‘INTRAVENOUS‘,‘TOPICAL‘)
LIMIT 200000;"),aes(x=route, fill = sex))+ geom_bar(a
R语言 读取大文件fread()
# R语言 读取大文件fread()
library(data.table)
visitor_sensor《-fread(’data_visitor_sensor.csv’,header = TRUE)
R语言文件读取
***隐藏网址***
逗号分隔文件 (.csv文件)、 制表符分隔文件 (.tsv文件)和 空格分隔文件 (.txt文件)
(一).csv文件的读取
mydata 《- read.csv(file=" ", header=T, sep=",", quote="\", dec=".", fill=T, comment.char=" ")
comment.char用于设置需要跳过的内容,比如需要跳过的行前面有“#”,那么设置comment.char=“#”,当然你也可以设置从中间开始读,注意,这个函数是read.csv里面的哦!
file: 以csv结尾的文件名,由文件所在路径及其文件名构成
header:是否把第一行作为表头
sep:分隔方式,csv文件分隔读入参数设置为"."
tsv文件分隔读入参数设置为"\t"
txt文件分隔为空格,不需要设置sep参数
也可以通过mydata 《- read.table("D:/mydata.csv", header=T, sep=",", row.names="id")读取
(二).tsv文件的读取
mydata 《- read.table("D:/mydata.tsv", header=T, sep="\t", row.names="id")
除了分隔方式跟上面一样
(三).txt文件的读取
mydata 《- read.table("c:/mydata.txt", header=TRUE, row.names="id")
除了分隔方式跟上面一样
(四)以.gz结尾的压缩文件的读取
1.在R中可以使用gzfile()的方式读取压缩文件
2.使用data.table包里的fread()函数
安装并加载data.table包
install.packages("data.table")
library(data.table)
使用fread()函数读取文件,这里参数和之前的一致,唯一的不同就是fread()可以直接读取压缩文件
mydata 《- fread(‘c:/mydata.txt.gz’, header=T, row.names=’id’)
(五)读取.xlsx后缀文件,也就是excel文件
1. 安装并加载openxlsx包
install.packages("openxlsx")
library(openxlsx)
2.进行数据的导入
mydata 《- read.xlsx( "mydata.xlsx",rowNames=T)
其他参数可以通过? read.xlsx在R中根据需要进行添加的。
R语言可以处理大的数据吗
看怎样定义大数据。很多人提到的data.table包处理几百万条数据还是挺快的,fread读进来只要十几秒,用dplyr包进行数据处理也很方便。可以去Kaggle上看看别人的scripts,这个网站上很多是census数据,数据量都不小,而且里面的script也很多都是用R或Python写的,适合初学者照猫画虎地学习模仿并加以运用。

更多文章:
gridview排序功能属性(怎么把datagridview中的自动排序功能禁用)
2025年6月15日 08:45
易语言主程序和dll通讯(C+的dll如何用易语言正确调用)
2026年4月8日 14:30
怎么制作网站ping工具(ping是什么 如何ping一个站点)
2026年4月7日 09:15
前端样式网站(前端开发应该知道的几个CSS网页表单布局技巧)
2026年2月10日 21:15
flash模板照片幻灯片放映按钮代码解释?如何使用C#操作幻灯片
2025年7月24日 18:45
delphi bit定义(delphi中如何定义TBitmap类型的变量)
2025年11月14日 19:00
bankstatement中文(bank statement是什么意思)
2026年4月5日 01:45
linux如何编程(linux编程开发如何实现对智能手机的开发)
2025年12月23日 13:00
compareto方法实现(java中compareto实现学生成绩排列)
2026年4月28日 01:00
win8如何重装系统(怎么重新安装win8系统|win8如何重新安装系统)
2026年5月29日 06:45










