殺殺
記錄一些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ò)誤地保存成日期格式
當(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ù)更新喲~