R語(yǔ)言讀數(shù)據(jù)

殺殺

記錄一些R語(yǔ)言讀入數(shù)據(jù)的方法還有可能遇到的問(wèn)題~

讀入數(shù)據(jù)時(shí),需要先了解數(shù)據(jù)文件的類型(也就是看后綴)。一般就能夠知道數(shù)據(jù)的類型和分隔符等信息。
另外,如果能夠用excel預(yù)覽一下數(shù)據(jù)的話,可以先看看數(shù)據(jù)是否有行列名。有些數(shù)據(jù)會(huì)有兩列的行名,如基因名-基因id-表達(dá)值······,特殊的數(shù)據(jù)需要額外的處理。

還需要注意一下matrix和data.frame的數(shù)據(jù)結(jié)構(gòu),matrix中只能有一種數(shù)據(jù)類型,這意味著如果在讀入數(shù)據(jù)時(shí)不進(jìn)行合適的處理,R會(huì)將數(shù)值強(qiáng)行讀成字符型,造成讀數(shù)據(jù)的錯(cuò)誤。

當(dāng)讀的是表達(dá)譜/測(cè)序數(shù)據(jù)時(shí)還有很重要的一點(diǎn),我以前就很喜歡在R處理數(shù)據(jù)前先用excel打開(kāi),進(jìn)行一些改動(dòng)然后保存,再讀取。但是有些基因會(huì)被excel錯(cuò)誤地保存成日期格式
excel(右),實(shí)際數(shù)據(jù)(右)

當(dāng)用excel存儲(chǔ)過(guò)之后,再用R處理時(shí),會(huì)提示你行名重復(fù),其實(shí)根本沒(méi)有重復(fù)。因此建議不要用excel保存這種數(shù)據(jù),一定要編輯可以使用notepad++或者ultra edit等軟件。

-----正題分割線-----
read.xx的函數(shù)是R的內(nèi)置函數(shù),可以直接讀取,并且設(shè)置一些參數(shù)

txt文件:

file <- read.table("filename.txt",header = T,row.names = 1,sep = "\t")
#第一行設(shè)為列名,第一列設(shè)為行名,sep默認(rèn)是空格,\t意為tab符

csv文件(請(qǐng)不要存儲(chǔ)為逗號(hào)分隔-utf-8,編碼方式不一樣,會(huì)報(bào)錯(cuò)的):

file <- read.csv("filename.txt",header = T,row.names = 1)
#第一行設(shè)為列名,第一列設(shè)為行名,sep默認(rèn)逗號(hào)

這些函數(shù)讀取后都默認(rèn)為data.frame,如果需要矩陣請(qǐng)使用as.matrix轉(zhuǎn)換。
一定要賦值,不然R語(yǔ)言會(huì)把大大的矩陣print出來(lái)。

read.delim

如果是沒(méi)怎么見(jiàn)過(guò)的類型:
這個(gè)函數(shù)會(huì)自動(dòng)識(shí)別你的分隔符,并且把第一行設(shè)為列名,但是沒(méi)辦法指定行名,需要讀入以后自己設(shè)置

file <- read.delim("filename.???")

fread

跟read.delim類似,可以讀各種類型的文件以及非常大的文件:

library(data.table)
file <- fread("filename.???")

讀取后默認(rèn)是一種data.table的數(shù)據(jù)類型,需要通過(guò)as.matrix/as.data.frame轉(zhuǎn)換后使用。

逐行讀取文件

像perl語(yǔ)言一樣,逐行讀取數(shù)據(jù)具有很大的優(yōu)勢(shì)
(萬(wàn)一文件超多行對(duì)吧)對(duì)于那種幾個(gè)G的文件,全部讀進(jìn)來(lái)可能會(huì)導(dǎo)致你的電腦死機(jī),所以我們可以先讀幾百行進(jìn)來(lái)看看,或者分批讀取,這樣不會(huì)占用電腦太大內(nèi)存,讀取方法和上文的一次性讀入有所不同-隨便找個(gè)文件舉例:

#首先要讀入一個(gè)列名(如果有列名的話)
temp <- file("CGGA.mRNAseq_325.RSEM-genes.20200506.txt", "r")
name <- t(as.matrix(strsplit(readLines(temp, 1), split='\t')[[1]]))

接下來(lái)繼續(xù)讀入數(shù)據(jù),比如說(shuō)我現(xiàn)在想讀4行,因?yàn)槲募莟xt類型,所以分隔設(shè)為\t

read1 <- readLines(temp, 4)
data <- read.table(text = read1, sep='\t', col.names = colname1,row.names = 1)

看看結(jié)果

讀取excel文件:

library(xlsx)
library(readxl)
data <- as.data.frame(read_excel("./Merge_Test/data/01_metadata_DNA.xlsx",sheet = k,col_names = T))

讀取excel多個(gè)sheet的文件:

第一種:把excel中所有sheet的表格讀入為data.frame,并分別命名為每個(gè)sheet的名稱

#先讀取一個(gè)xlsx文件中所有sheet的名稱
sheetnames <- readxl::excel_sheets("./Merge_Test/data/01_metadata_DNA.xlsx")
for(k in (1:length(sheetnames)))
{
temp <- as.data.frame(read_excel("./Merge_Test/data/01_metadata_DNA.xlsx",sheet = k,col_names = T))
assign(unlist(sheetnames)[k],temp)
}

---請(qǐng)忽略硬核打碼

第二種:把excel中所有sheet的表格讀入為矩陣,并放進(jìn)一個(gè)list中

library(xlsx)
library(rJava)
library(xlsxjars)
library(readxl)
library(XLConnect)
library(rio)
library(tidyverse)
list_result <- list()
for(k in (1:length(sheetnames)))
{
   temp <- as.data.frame(read_excel("./Merge_Test/data/01_metadata_DNA.xlsx",sheet = k,col_names = T))
   list_result <- c(list_result,list(temp))
}
list_result2 <- list_result %>% set_names(sheetnames)

批量讀文件:

R語(yǔ)言批量讀文件
批量讀excel的xlsx文件原理是和讀其它文件一樣的。

學(xué)到了新的會(huì)持續(xù)更新喲~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容