【R分享|实战】 新手福利~认识数据集的内在
数据集的概念
数据集通常是由数据构成的一个矩形数组,行表示观测,列表示变量。例如,土壤学领域(土壤基本的理化因子)的通常数据情况:当然行列的数据类型也并非固定。
SOC | pH | TN | TP | |
Sample1 | -- | -- | -- | -- |
Sample2 | -- | -- | -- | -- |
Sample3 | -- | -- | -- | -- |
... | ... | ... | ... | ... |
在R中,数据集包括以下两步:1)选择一种数据结构来储存数据;2)将数据输入或导入到这个数据结构中。另外,R主要可处理的数据类型包括数值型、字符型、逻辑型(TRUE or FALSE)、复数型(虚数)和原生型(字节)。
数据结构的类型
a <- -5 # 可以是数字1,'abc’字符,TRUE or FALSE 等
2)向量
向量是用于存储数值型、字符型或逻辑型数据的一维数组。执行组合功能的函数c()可用来创建向量。例如:
b <- c("first", "second", "third") # b属于字符型向量
c <- c(TRUE, TRUE, TRUE, TRUE, TRUE, FALSE) # c是逻辑型向量
3)矩阵
矩阵是一个二维数组,只是每个元素都拥有相同的数据类型(同上三种)。可用函数matrix()创建矩阵。
x <- matrix(1:20, nrow = 4, ncol = 3) #1 创建一个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的矩阵,根据逻辑byrow = TRUE
mymatrix
mymatrix <- matrix(cells, nrow = 2, ncol = 2, byrow = FALSE,
dimnames = list(rnames, cnames)) #3 按列填充3×3的矩阵,根据逻辑byrow = FALSE
mymatrix
我们可以使用下标和方括号来选择矩阵中的行、列或元素。x[i, ]指矩阵中x中的第i行,x[i, j]指第i行第j个元素。选择多行或多列时,下标i和j可为数值型向量。For example:
x <- matrix(1:9, nrow = 3) # 构建了一个内容为数字1到9的3×3矩阵 默认下,按行列填充
x # 查看所构建的矩阵
x[3,] # 选择了第三行的元素
x[,3] # 选择了第三列的元素
x[1,3] # 又选择第一行第三列的元素
x[1,c(2,3)] # 最后选择了位于第一行第二、第三的元素
4)数组
数组(array)与矩阵类似,但纬度可以大于2。数组可以用array函数构建,例如:
my_array <- (vector, dimensions, dimnames)
dim1 <- c("a1", "a1") # 引号内的名称是我随便输入的,都是字符型
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)数据框
mydata <- data.frame (col1,col2,col3) # col1,2,3 等可为任何类型。每一列的名称可以由names函数指定
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
#需要注意,每一列数据的类型必须唯一,但可以将多个类型的不同列放到一起组成数据框。
patientdata[1:2] # 选取第一列到第二列的数据
patientdata[c("diabetes","status")] # 选取变量名为d...,s...的数据
patientdata$age # 标记号$是用来选取数据框中的特定age变量
#另外,如果想生成变量diabetes和变量status的列联表,可以使用table函数
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 函数因子用于将向量编码为因子
status <- factor(status, order = TRUE) # order 逻辑标志,用于确定是否应该将级别视为有序的
patientdata <- data.frame(ID, age, diabetes, status) # 构建新的数据集
str(patientdata) # 查看数据集结构 也可以用class 但是这个函数查阅的结果比较简单
summary(patientdata) # summary是一个通用函数,用于生成各种模型拟合函数结果
7)列表
列表(list)是R的数据类型中最为复杂的一种。通常,列表就是一些对象或成分的有序集合。列表允许你整合若干对象到单个对象名下。例如,某个列表中可能包含若干向量、矩阵、数据框,甚至其他列表的组合。可用list()函数构建列表:
mylist <- list(obj1, obj2,...)
# 也可以为列表中的对象命名
mylist <- list(name1=obj1, name2=obj2,...)
具体例子:
a <- "my list" # 构建列表的title
b <- c(20, 25, 26, 35)
c <- matrix(1:8, nrow=4) # 构建一个矩阵 8个值 4行
d <- c("first", "second", "third")
mylist <- list(title=a, ages=b, c, d) # 构建一个列表, 并用age 命名
mylist # 输出列表内容 包含一个字符串、数值型向量、矩阵及字符型向量
mylist[[2]]
mylist[["ages"]] # 两种方法提取出一样的结果
数据的输入
R中的函数edit()自动调用一个手动输入数据的文本编译器。步骤如下:
data <- data.frame(time=numeric(0), type=character(0), hight=numeric(0)) # 0 表示不定义具体值
data <- edit(data)
通过edit()函数调用出数据编辑器,如下图
R软件弹出数据编辑器后,我们就可以点击第四列格子进行变量的定义。例如这里点击"var4"后,就会弹出一个编辑器,这里我们就可以对变量的变量名和类型(数值,字符)进行定义。
此外,可以直接在程序中嵌入数据集,例如:
mydatatxt <- "
age gender weight
25 m 166
30 f 115
18 f 120
"
mydata <- read.table(header = TRUE,text=mydatatxt)
2)使用函数导入数据(主要以excel文件格式为主)
①导入csv或txt文件,使用基础的read.table()函数导入数据。另外,也可以使用read.csv()函数。该函数可以读入一个表格格式的文件并保存为一个数据框。基本的语法表达式:
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)
②导入excel文件,需要用到R包library(xlsx),可以直接导入Excel工作表。但是要确保第一次使用前先进行下载和安装。同时也需要xlsxJars和rJava包还有openxlsx包,及一个正常工作的Java安装(http://java.com)。优势:一个文件夹存储多个sheet,数据读取的时候不需要新建多个文件。基本的语法表达式:
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)
数据的导出
a <- data(mpg) # 将R语言自带的数据集mpg赋值给a
write.table (a, file ="", sep ="", row.names =TRUE, col.names =TRUE, quote =TRUE) # 导出a名下的数据
x:需要导出的数据,这里是指前面赋值过的数据。
file:导出的文件路径。
sep:分隔符,默认为空格(" "),也就是以空格为分割列。
row.names:是否导出行序号,默认为TRUE,也就是导出行序号。
col.names:是否导出列名,默认为TRUE,也就是导出列名。
quote:字符串是否使用引号表示,默认为TRUE,也就是使用引号表示。
例如:将数据框C输出为.csv文件
C <- data(iris)
write.table(C, file="ABC.csv",sep = ",",row.names=FALSE) # 将保存ABC文件在R的工作目录下,当不加sep = " "时,输出的数据会在同一个单元格里,因此要加“,”。
附上完整的代码:
###########################
# 新手福利~认识数据集的内在
###########################
#1 标量
a <- -5 # 可以是数字1,'abc’字符,TRUE or FALSE 等
#2 向量
a <- c(2, 3, 4, 5, 5, -1, -2) # a属于数值型向量
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 创建一个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的矩阵,根据逻辑byrow = TRUE
mymatrix
mymatrix <- matrix(cells, nrow = 2, ncol = 2, byrow = FALSE,
dimnames = list(rnames, cnames)) #3 按列填充3×3的矩阵,根据逻辑byrow = FALSE
mymatrix
# 提取数据
x <- matrix(1:9, nrow = 3) # 构建了一个内容为数字1到9的3×3矩阵 默认下,按行列填充
x # 查看所构建的矩阵
x[3,] # 选择了第三行的元素
x[,3] # 选择了第三列的元素
x[1,3] # 又选择第一行第三列的元素
x[1,c(2,3)] # 最后选择了位于第一行第二、第三的元素
#4 数组
my_array <- (vector, dimensions, dimnames)
dim1 <- c("a1", "a1") # 引号内的名称是我随便输入的,都是字符型
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 数据框
mydata <- data.frame (col1,col2,col3) # col1,2,3 等可为任何类型。每一列的名称可以由names函数指定
# 具体例子
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
#需要注意,每一列数据的类型必须唯一,但可以将多个类型的不同列放到一起组成数据框。
# 数据提取
patientdata[1:2] # 选取第一列到第二列的数据
patientdata[c("diabetes","status")] # 选取变量名为d...,s...的数据
patientdata$age # 标记号$是用来选取数据框中的特定age变量
#另外,如果想生成变量diabetes和变量status的列联表,可以使用table函数
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 函数因子用于将向量编码为因子
status <- factor(status, order = TRUE) # order 逻辑标志,用于确定是否应该将级别视为有序的
patientdata <- data.frame(ID, age, diabetes, status) # 构建新的数据集
str(patientdata) # 查看数据集结构 也可以用class 但是这个函数查阅的结果比较简单
summary(patientdata) # summary是一个通用函数,用于生成各种模型拟合函数结果
#7 列表
# 具体例子
a <- "my list" # 构建列表的title
b <- c(20, 25, 26, 35)
c <- matrix(1:8, nrow=4) # 构建一个矩阵 8个值 4行
d <- c("first", "second", "third")
mylist <- list(title=a, ages=b, c, d) # 构建一个列表, 并用age 命名
mylist # 输出列表内容 包含一个字符串、数值型向量、矩阵及字符型向量
# 提取数据
mylist[[2]]
mylist[["ages"]] # 两种方法提取出一样的结果
# 数据的输入和导出部分就不在这做整合了,大家可以根据推送内容进行学习
4. write.table / read.table 既可以读取txt文件也可以导入csv格式的文件。