數(shù)據(jù)集的概念
數(shù)據(jù)集通常是由數(shù)據(jù)構(gòu)成的一個矩形數(shù)組,行表示觀測,列表示變量。例如,土壤學(xué)領(lǐng)域(土壤基本的理化因子)的通常數(shù)據(jù)情況:當(dāng)然行列的數(shù)據(jù)類型也并非固定。
SOC | pH | TN | TP | |
Sample1 | -- | -- | -- | -- |
Sample2 | -- | -- | -- | -- |
Sample3 | -- | -- | -- | -- |
... | ... | ... | ... | ... |
在R中,數(shù)據(jù)集包括以下兩步:1)選擇一種數(shù)據(jù)結(jié)構(gòu)來儲存數(shù)據(jù);2)將數(shù)據(jù)輸入或?qū)氲竭@個數(shù)據(jù)結(jié)構(gòu)中。另外,R主要可處理的數(shù)據(jù)類型包括數(shù)值型、字符型、邏輯型(TRUE or FALSE)、復(fù)數(shù)型(虛數(shù))和原生型(字節(jié))。
數(shù)據(jù)結(jié)構(gòu)的類型
a <- -5 # 可以是數(shù)字1,'abc’字符,TRUE or FALSE 等
2)向量
向量是用于存儲數(shù)值型、字符型或邏輯型數(shù)據(jù)的一維數(shù)組。執(zhí)行組合功能的函數(shù)c()可用來創(chuàng)建向量。例如:
3)矩陣
矩陣是一個二維數(shù)組,只是每個元素都擁有相同的數(shù)據(jù)類型(同上三種)??捎煤瘮?shù)matrix()創(chuàng)建矩陣。
x <- matrix(1:20, nrow = 4, ncol = 3) #1 創(chuàng)建一個4×3的矩陣
x
cells <- c(1, 26, 24, 68)
rnames <- c("R1", "R2")
cnames <- c("C1", "C2")
mymatrix <- matrix(cells, nrow = 3, ncol = 3, byrow = TRUE,
dimnames = list(rnames, cnames)) #2 按行填充3×3的矩陣,根據(jù)邏輯byrow = TRUE
mymatrix
mymatrix <- matrix(cells, nrow = 2, ncol = 2, byrow = FALSE,
dimnames = list(rnames, cnames)) #3 按列填充3×3的矩陣,根據(jù)邏輯byrow = FALSE
mymatrix
我們可以使用下標(biāo)和方括號來選擇矩陣中的行、列或元素。x[i, ]指矩陣中x中的第i行,x[i, j]指第i行第j個元素。選擇多行或多列時,下標(biāo)i和j可為數(shù)值型向量。For example:
x <- matrix(1:9, nrow = 3) # 構(gòu)建了一個內(nèi)容為數(shù)字1到9的3×3矩陣 默認下,按行列填充
x # 查看所構(gòu)建的矩陣
x[3,] # 選擇了第三行的元素
x[,3] # 選擇了第三列的元素
x[1,3] # 又選擇第一行第三列的元素
x[1,c(2,3)] # 最后選擇了位于第一行第二、第三的元素
4)數(shù)組
數(shù)組(array)與矩陣類似,但緯度可以大于2。數(shù)組可以用array函數(shù)構(gòu)建,例如:
my_array <- (vector, dimensions, dimnames)
dim1 <- c("a1", "a1") # 引號內(nèi)的名稱是我隨便輸入的,都是字符型
dim2 <- c("bb1", "bb2", "bb3")
dim3 <- c("ccc1", "ccc2", "ccc3")
z <- array(1:18, c(2, 3, 3), dimnames = list(dim1, dim2, dim3))
z
5)數(shù)據(jù)框
mydata <- data.frame (col1,col2,col3) # col1,2,3 等可為任何類型。每一列的名稱可以由names函數(shù)指定
ID <- c(1, 2, 3, 4)age <- c(20, 35, 15, 55)
diabetes <- c("T1", "T2", "T3" , "T4")
status <- c("Poor", "Improved", "Excellent", "Improved")
patientdata <- data.frame(ID, age, diabetes, statues)
patientdata
#需要注意,每一列數(shù)據(jù)的類型必須唯一,但可以將多個類型的不同列放到一起組成數(shù)據(jù)框。
patientdata[1:2] # 選取第一列到第二列的數(shù)據(jù)
patientdata[c("diabetes","status")] # 選取變量名為d...,s...的數(shù)據(jù)
patientdata$age # 標(biāo)記號$是用來選取數(shù)據(jù)框中的特定age變量
#另外,如果想生成變量diabetes和變量status的列聯(lián)表,可以使用table函數(shù)
table(patientdata$diabetes, patientdata$status)
ID <- c(1, 2, 3, 4)
age <- c(25, 35, 15, 55)
diabetes <- c("T1", "T2", "T1", "T1")
status <- c("Poor", "Improved", "Excellent", "Poor")
diabetes <- factor(diabetes) # factor 函數(shù)因子用于將向量編碼為因子
status <- factor(status, order = TRUE) # order 邏輯標(biāo)志,用于確定是否應(yīng)該將級別視為有序的
patientdata <- data.frame(ID, age, diabetes, status) # 構(gòu)建新的數(shù)據(jù)集
str(patientdata) # 查看數(shù)據(jù)集結(jié)構(gòu) 也可以用class 但是這個函數(shù)查閱的結(jié)果比較簡單
summary(patientdata) # summary是一個通用函數(shù),用于生成各種模型擬合函數(shù)結(jié)果
7)列表
列表(list)是R的數(shù)據(jù)類型中最為復(fù)雜的一種。通常,列表就是一些對象或成分的有序集合。列表允許你整合若干對象到單個對象名下。例如,某個列表中可能包含若干向量、矩陣、數(shù)據(jù)框,甚至其他列表的組合。可用list()函數(shù)構(gòu)建列表:
mylist <- list(obj1, obj2,...)
# 也可以為列表中的對象命名
mylist <- list(name1=obj1, name2=obj2,...)
具體例子:
a <- "my list" # 構(gòu)建列表的title
b <- c(20, 25, 26, 35)
c <- matrix(1:8, nrow=4) # 構(gòu)建一個矩陣 8個值 4行
d <- c("first", "second", "third")
mylist <- list(title=a, ages=b, c, d) # 構(gòu)建一個列表, 并用age 命名
mylist # 輸出列表內(nèi)容 包含一個字符串、數(shù)值型向量、矩陣及字符型向量
mylist[[2]]
mylist[["ages"]] # 兩種方法提取出一樣的結(jié)果
數(shù)據(jù)的輸入
data <- data.frame(time=numeric(0), type=character(0), hight=numeric(0)) # 0 表示不定義具體值
data <- edit(data)
通過edit()函數(shù)調(diào)用出數(shù)據(jù)編輯器,如下圖
R軟件彈出數(shù)據(jù)編輯器后,我們就可以點擊第四列格子進行變量的定義。例如這里點擊"var4"后,就會彈出一個編輯器,這里我們就可以對變量的變量名和類型(數(shù)值,字符)進行定義。
此外,可以直接在程序中嵌入數(shù)據(jù)集,例如:
mydatatxt <- "
age gender weight
25 m 166
30 f 115
18 f 120
"
mydata <- read.table(header = TRUE,text=mydatatxt)
2)使用函數(shù)導(dǎo)入數(shù)據(jù)(主要以excel文件格式為主)
①導(dǎo)入csv或txt文件,使用基礎(chǔ)的read.table()函數(shù)導(dǎo)入數(shù)據(jù)。另外,也可以使用read.csv()函數(shù)。該函數(shù)可以讀入一個表格格式的文件并保存為一個數(shù)據(jù)框?;镜恼Z法表達式:
dat <- read.table(file, header=TRUE, sep="", row.names=1)
dat <- read.csv(file, header=TRUE, sep=",", row.names=1)
具體:
data <- read.table("C:/Program Files/R/R-3.6.1/library/xx.txt", header = T)
data <- read.csv("C:/Program Files/R/R-3.6.1/library/xx.csv", header = T)
②導(dǎo)入excel文件,需要用到R包library(xlsx),可以直接導(dǎo)入Excel工作表。但是要確保第一次使用前先進行下載和安裝。同時也需要xlsxJars和rJava包還有openxlsx包,及一個正常工作的Java安裝(http://java.com)。優(yōu)勢:一個文件夾存儲多個sheet,數(shù)據(jù)讀取的時候不需要新建多個文件。基本的語法表達式:
mydata <- read.xlsx(file, sheet=n)
library("xlsxjars")
library("rJava")
library("xlsx")
library("openxlsx")
data <- read.xlsx("C:/Program Files/R/R-3.6.1/library/xx.xlsx", 1)
數(shù)據(jù)的導(dǎo)出
a <- data(mpg) # 將R語言自帶的數(shù)據(jù)集mpg賦值給a
write.table (a, file ="", sep ="", row.names =TRUE, col.names =TRUE, quote =TRUE) # 導(dǎo)出a名下的數(shù)據(jù)
x:需要導(dǎo)出的數(shù)據(jù),這里是指前面賦值過的數(shù)據(jù)。
file:導(dǎo)出的文件路徑。
sep:分隔符,默認為空格(" "),也就是以空格為分割列。
row.names:是否導(dǎo)出行序號,默認為TRUE,也就是導(dǎo)出行序號。
col.names:是否導(dǎo)出列名,默認為TRUE,也就是導(dǎo)出列名。
quote:字符串是否使用引號表示,默認為TRUE,也就是使用引號表示。
例如:將數(shù)據(jù)框C輸出為.csv文件
C <- data(iris)
write.table(C, file="ABC.csv",sep = ",",row.names=FALSE) # 將保存ABC文件在R的工作目錄下,當(dāng)不加sep = " "時,輸出的數(shù)據(jù)會在同一個單元格里,因此要加“,”。
附上完整的代碼:
###########################
# 新手福利~認識數(shù)據(jù)集的內(nèi)在
###########################
#1 標(biāo)量
a <- -5 # 可以是數(shù)字1,'abc’字符,TRUE or FALSE 等
#2 向量
a <- c(2, 3, 4, 5, 5, -1, -2) # a屬于數(shù)值型向量
b <- c("first", "second", "third") # b屬于字符型向量
c <- c(TRUE, TRUE, TRUE, TRUE, TRUE, FALSE) # c是邏輯型向量
#3 矩陣
x <- matrix(1:20, nrow = 4, ncol = 3) #1 創(chuàng)建一個4×3的矩陣
x
cells <- c(1, 26, 24, 68)
rnames <- c("R1", "R2")
cnames <- c("C1", "C2")
mymatrix <- matrix(cells, nrow = 3, ncol = 3, byrow = TRUE,
dimnames = list(rnames, cnames)) #2 按行填充3×3的矩陣,根據(jù)邏輯byrow = TRUE
mymatrix
mymatrix <- matrix(cells, nrow = 2, ncol = 2, byrow = FALSE,
dimnames = list(rnames, cnames)) #3 按列填充3×3的矩陣,根據(jù)邏輯byrow = FALSE
mymatrix
# 提取數(shù)據(jù)
x <- matrix(1:9, nrow = 3) # 構(gòu)建了一個內(nèi)容為數(shù)字1到9的3×3矩陣 默認下,按行列填充
x # 查看所構(gòu)建的矩陣
x[3,] # 選擇了第三行的元素
x[,3] # 選擇了第三列的元素
x[1,3] # 又選擇第一行第三列的元素
x[1,c(2,3)] # 最后選擇了位于第一行第二、第三的元素
#4 數(shù)組
my_array <- (vector, dimensions, dimnames)
dim1 <- c("a1", "a1") # 引號內(nèi)的名稱是我隨便輸入的,都是字符型
dim2 <- c("bb1", "bb2", "bb3")
dim3 <- c("ccc1", "ccc2", "ccc3")
z <- array(1:18, c(2, 3, 3), dimnames = list(dim1, dim2, dim3))
z
#5 數(shù)據(jù)框
mydata <- data.frame (col1,col2,col3) # col1,2,3 等可為任何類型。每一列的名稱可以由names函數(shù)指定
# 具體例子
ID <- c(1, 2, 3, 4)age <- c(20, 35, 15, 55)
diabetes <- c("T1", "T2", "T3" , "T4")
status <- c("Poor", "Improved", "Excellent", "Improved")
patientdata <- data.frame(ID, age, diabetes, statues)
patientdata
#需要注意,每一列數(shù)據(jù)的類型必須唯一,但可以將多個類型的不同列放到一起組成數(shù)據(jù)框。
# 數(shù)據(jù)提取
patientdata[1:2] # 選取第一列到第二列的數(shù)據(jù)
patientdata[c("diabetes","status")] # 選取變量名為d...,s...的數(shù)據(jù)
patientdata$age # 標(biāo)記號$是用來選取數(shù)據(jù)框中的特定age變量
#另外,如果想生成變量diabetes和變量status的列聯(lián)表,可以使用table函數(shù)
table(patientdata$diabetes, patientdata$status)
#6 因子
ID <- c(1, 2, 3, 4)
age <- c(25, 35, 15, 55)
diabetes <- c("T1", "T2", "T1", "T1")
status <- c("Poor", "Improved", "Excellent", "Poor")
diabetes <- factor(diabetes) # factor 函數(shù)因子用于將向量編碼為因子
status <- factor(status, order = TRUE) # order 邏輯標(biāo)志,用于確定是否應(yīng)該將級別視為有序的
patientdata <- data.frame(ID, age, diabetes, status) # 構(gòu)建新的數(shù)據(jù)集
str(patientdata) # 查看數(shù)據(jù)集結(jié)構(gòu) 也可以用class 但是這個函數(shù)查閱的結(jié)果比較簡單
summary(patientdata) # summary是一個通用函數(shù),用于生成各種模型擬合函數(shù)結(jié)果
#7 列表
# 具體例子
a <- "my list" # 構(gòu)建列表的title
b <- c(20, 25, 26, 35)
c <- matrix(1:8, nrow=4) # 構(gòu)建一個矩陣 8個值 4行
d <- c("first", "second", "third")
mylist <- list(title=a, ages=b, c, d) # 構(gòu)建一個列表, 并用age 命名
mylist # 輸出列表內(nèi)容 包含一個字符串、數(shù)值型向量、矩陣及字符型向量
# 提取數(shù)據(jù)
mylist[[2]]
mylist[["ages"]] # 兩種方法提取出一樣的結(jié)果
# 數(shù)據(jù)的輸入和導(dǎo)出部分就不在這做整合了,大家可以根據(jù)推送內(nèi)容進行學(xué)習(xí)
4. write.table / read.table 既可以讀取txt文件也可以導(dǎo)入csv格式的文件。