《R语言与数据挖掘》②基本数据类型和数据读取

书籍:《R语言与数据挖掘》

作者:张良均

出版社:机械工业出版社

ISBN:9787111540526

本书由北京华章图文信息有限公司授权杭州云悦读网络有限公司电子版制作与发行

版权所有·侵权必究


数据类型的判别及转换

a <- 1:4 # 创建一个1:4的序列
x = c(a,NA) # 构建一个对象
is.na(x)  # 判别是否存在缺失值
class(a)# 查看数据类型
is.numeric(a) # 判别是否是数值型数据
is.vector(a) # 判别是否是向量型数据
is.character(a) # 判别是否是字符型数据
is.logical(a) # 判别是否是字符型数据
is.array(a) # 判别是否是布尔型数据
is.data.frame(a) # 判别是否是数据框数据
is.matrix(a) # 判别是否是矩阵数据
is.factor(a) # 判别是否是因子型数据
as.character(a) # 将数据转化为字符型数据 ,这里将as.XXX 转化对应的数据类型即可

将字符型日期值转换为日期变量


# 日期变量的转换
# 日期变量的转换
# 创建字符串的日期值
d1<-c("2011-01-02", "2011-01-09" ,"2011-01-16", "2011-01-23", "2011-01-30"
      ,"2011-02-06", "2011-02-13", "2011-02-20" ,"2011-02-27" ,"2011-03-06"
      , "2011-03-13", "2011-03-20" ,"2011-03-27", "2011-04-03", "2011-04-10"
      , "2011-04-17" ,"2011-04-24", "2011-05-01", "2011-05-08", "2011-05-15"
      , "2011-05-22" ,"2011-05-29", "2011-06-05" ,"2011-06-12", "2011-06-19"
      , "2011-06-26", "2011-07-03", "2011-07-10" ,"2011-07-17" ,"2011-07-24"
      , "2011-07-31", "2011-08-07" )
# 按照月日年的格式进行转换
(date <- as.Date(d1, "%Y-%m-%d"))


将字符串型日期时间值转换为时间变量


# 时间变量的转换
# 创建一个字符型日期时间变量
x <- c("2016-02-08 10:07:52", "2016-08-07 19:33:02")
# 判定是否为字符型变量
is.character(x)
# 对字符串形式的日期时间值按照格式进行转换
as.POSIXlt(x, tz = "", "%Y-%m-%d %H:%M:%S")
# 按年月日 时分秒的格式转换为时间变量
(x <- strptime(x, "%Y-%m-%d %H:%M:%S"))

创建3个不同类型的数据,展示3个辨别函数的区别

# 创建一个数据框,内含3个3种不同类型的向量,设置参数避免自动转化为因子型
df <- data.frame(c1 = letters[1:3], c2 = 1:3, c3 = c(1, -1, 3.0), 
                 stringsAsFactors = FALSE)
# 使用mode()函数分别对3个向量的数据类型进行查看
sapply(df, mode)
# 使用class()函数分别对3个向量的数据类型进行查看
sapply(df, class)
# 使用typeof()函数分别对3个向量的数据类型进行查看
sapply(df, typeof)

参考:https://blog.csdn.net/lfgxiaogang/article/details/52493571
mode:表示对象在内存中的存储类型
基本数据类型’atomic’ mode:
numeric(Integer/double), complex, character和logical
递归的对象(recursive object):
‘list’ 或 ‘function’

class:是一种抽象类型,或者理解为一种数据结构
他主要是用来给泛型函数(参考java中泛型的概念)识别参数用。
如下例,你可以看到数据在内存中是列表的形式存储,却被包装成数据框来操作。(数据框其实是一种特殊的列表)

typeof是对变量类型的细分,一个字符串。可能的值列在“src/main/util.c”的结构类型表中。当前值是向量类型“logical”、“integer”、“double”、“complex”、“character”、“raw”和“list”、“NULL”、“closure”(函数)、“special”和“builtin”(基本函数和运算符)、“environment”、“S4”(某些 S4 对象)和其他不太可能在用户级别看到的(“symbol”, “pairlist”, “promise”, “language”, “char”, “…”, “any”, “expression”, “externalptr”, “bytecode” and “weakref”).

向量操作

vector <- c(1, 2, 3, 4)  # 创建向量
# 下标方式索引(元素的值)
vector <- c(1, 2, 3, 4)  # 创建向量
vector[1]  # 查看第一个元素
vector[c(1:3)]  # 查看前三个元素
vector[-1]  # 查看除了第一个元素之外的所有元素
vector[-c(1:3)]  # 查看除了前三个元素之外的所有元素
vector[c(TRUE, TRUE, FALSE, FALSE)]  # 通过逻辑序列查看前两个元素

# 按名称索引	
names(vector) <- c("one", "two", "three", "four")  # 给向量中每个元素命名
vector[c("one", "two", "four")]  # 查看名称为“one”,“two”,“four”的元素、
# which方式索引(元素的位置)
which(vector == 1)  # 向量中等于1的元素所在的位置
which(vector == c(1, 2))  # 向量中等于1和2的元素所在的位置
which(vector != 1)  # 向量中不等于1的元素所在的位置
which(vector > 2 & vector < 4)  # 满足多重条件的元素所在的位置
which.max(vector)  # 最大值所在的位置
which.min(vector)  # 最小值所在的位置
# subset方式索引
subset(vector, vector > 2 & vector < 4)  # 检索向量中满足条件的元素
# match方式索引
match(vector, c(1, 3))  # 判断向量中的元素是否等于1或3
# %in%方式索引
c(1, 5) %in% vector  # 判断向量中是否包含某项数据
# 向量编辑
x <- c(1, 2, 3, 4)
# 向量扩展
(x <- c(x, c(5, 6, 7)))
# 单个元素的删除
(x <- x[-1])
# 多个元素的删除
(x <- x[c(3:5)])
# 向量排序
# 创建3个无序的向量
x <- c(5, 6, 8, 7, 4, 1, 9)
x1 <- c("B", "A", "C")
x2 <- c(3, 2, NA, 1, 4, 5)
# 数值型数据排序(默认顺序为升序)
sort(x, decreasing = FALSE) 
sort(x, decreasing = TRUE)
# 字符型数据排序
sort(x1)
# 将缺失值(NA)放置到序列最末尾
sort(x2, na.last = TRUE)
# 倒序
rev(x)
# 创建等差序列
> seq(1, -9)  # 只给出首项和尾项数据,by自动匹配为1或-1
 [1]  1  0 -1 -2 -3 -4 -5 -6 -7 -8 -9
> seq(1, -9, length.out = 5)  # 给出首项和尾项数据以及长度,自动计算等差
[1]  1.0 -1.5 -4.0 -6.5 -9.0
> seq(1, -9, by = -2)  # 给出首项和尾项数据以及等差,自动计算长度
[1]  1 -1 -3 -5 -7 -9
> seq(1, by = 2, length.out = 10) #给出首项和等差以及序列长度数据,自动计算尾项
 [1]  1  3  5  7  9 11 13 15 17 19
# 重复序列
> rep(1:3, 2)  # 重复序列两次
[1] 1 2 3 1 2 3
> rep(1:3, each = 2)  # 序列中各个元素分别重复两次
[1] 1 1 2 2 3 3
> rep(1:3, c(2, 1, 2))  # 按照规则重复序列中的各个元素
[1] 1 1 2 3 3
> rep(1:3, each = 2, length.out = 4)  # 序列中各个元素分别重复两次,规定生成序列的长度为4
[1] 1 1 2 2
> rep(1:3, each = 2, times = 3)  # 序列中各个元素分别重复两次,整个序列重复3次
 [1] 1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3
> rep(as.factor(c("因子1", "因子2", "因子3")), 3)  # 将因子型变量序列重复3次
[1] 因子1 因子2 因子3 因子1 因子2 因子3 因子1 因子2 因子3
Levels: 因子1 因子2 因子3

矩阵操作

# 创建向量作为矩阵的数据
x <- c(1:12)
# 创建一个矩阵,定义矩阵的列数为2,行数为5,按行读取数据
(a <- matrix(x, ncol = 3, nrow = 4, byrow = T))       # 默认按行排列 
# 创建一个矩阵,定义矩阵的列数为2,行数为5,按列读取数据
b <- matrix(x)
dim(b) <- c(3,4)   
b
# 创建一个2行6列,按列读取数据的矩阵,dimnames定义矩阵行列的名称
(c <- matrix(x, ncol = 2, nrow = 6, byrow = F, 
             dimnames = list(c("r1", "r2", "r3", "r4", "r5","r6"), c("c1", "c2"))))
# 矩阵转化为向量
vec1 = as.vector(x)
vec1

# 矩阵索引
# 示例矩阵
x = c(1:12)
(c <- matrix(x, ncol = 2, nrow = 6, byrow = F, 
             dimnames = list(c("r1", "r2", "r3", "r4", "r5","r6"), c("c1", "c2"))))
a
# 根据位置索引
a[2, 1]
# 根据行和列的名称索引
a["r2", "c1"]
# 使用一维下标索引
a[1, ]  # 检索第一行
a[, 1]  # 检索第一列
# 使用数值型向量索引
a[c(3:5), ]  # 检索第三至第五行


# 矩阵的编辑
# 示例矩阵
x <- c(1:10)
(a <- matrix(x, ncol = 2, nrow = 5, byrow = F))
# 矩阵合并
(a1 <- rbind(a, c(11,12)))  # 按行的形式合并
(a2 <- cbind(a, c(11:15)))  # 按列的形式合并
(a3 <- rbind(a, 1))  # 按行的形式合并时,循环不足后合并
(a4 <- cbind(a, 1))  # 按列的形式合并时,循环不足后合并
# 删除矩阵中的元素
(a5 <- a[-1, ])  # 删除矩阵的第一行
(a6 <- a[, -1])  # 删除矩阵的第一列


# 矩阵的运算
A <- matrix(c(1:4), ncol = 2, nrow = 2)
B <- matrix(c(4:1), ncol = 2, nrow = 2)
# 四则运算:加减乘除,要求两个矩阵的维数相同,对应各位置的元素做运算
C <- 2 * A + B - B / A
# 对矩阵的各列求和
colsums_A <- colSums(A)
# 对矩阵的各列求均值
colmeans_A <- colMeans(A)
# 对矩阵的各行求和
rowsums_A <- rowSums(A)
# 对矩阵的各行求均值
rowmeans_A <- rowMeans(A)
# 转置运算
trans_A <- t(A)  # 行列转置
# 方阵求解行列式
det_A <- det(A)
# 矩阵的内积 
crossprod(A, B)
inner_product <- t(A) %*% B  # 等价于crossprod(A,B)
# 矩阵的外积(叉积)
outer(A,B)
cross_product <- A %o% B  # 等价于outer(A,B)
# 矩阵的乘法,要求矩阵A的列数和矩阵B的行数相等
(D <- A %*% B)
# 矩阵取对角运算及生成对角阵
diag_A <- diag(A)  # 矩阵取对角
diag(diag_A)  # 生成对角阵
# 求解逆矩阵,要求矩阵可逆(行列式不为0)
M <- matrix(c(1:8, 10), ncol = 3, nrow = 3)   
inverse_M <- solve(M)
# 求解矩阵的特征值和特征向量
(ev_M <- eigen(M))

数组操作

# 创建数组
x <- c(1:8)
# 定义数组各维度的名称
dim1 <- c("A1", "A2")
dim2 <- c("B1", "B2")
dim3 <- c("table1", "table2")
# 创建数组,数组维数为3,各维度下标的最大值为2,2,2
(a <- array(x, dim = c(2,2,2), dimnames = list(dim1, dim2, dim3)))

# 数组索引
# 根据位置索引
(a[2,2,1])
# 根据维度名称索引
(a["A2", "B2", "C1"])
# 查看数组的维度
dim(a)


数据框操作

# 创建数据框
# 向量组成数据框
df <- data.frame(X1 = c(5.1, 4.9, 4.7, 4.6), 
                        X2 = c(3.5, 3.0, 3.2, 3.1), 
                        X3 = c(1.4, 1.4, 1.3, 1.5),
                        Probability = rep(0.2, 4))
df
# 矩阵转化为数据框
(data_matrix <- matrix(1:8, c(4, 2)))  # 创建一个矩阵
(data.frame(data_matrix))  # 将矩阵转化为数据框

```r
> # 列索引
> df[, 1]  # 索引第一列
[1] 5.1 4.9 4.7 4.6
> df$X1  # 按列的名称索引
[1] 5.1 4.9 4.7 4.6
> df["X1"]  # 按列的名称索引
   X1
1 5.1
2 4.9
3 4.7
4 4.6
> # 行索引
> df[1, ]  # 索引第一行
   X1  X2  X3 Probability
1 5.1 3.5 1.4         0.2
> df[1:3, ]  # 索引第一至三行
   X1  X2  X3 Probability
1 5.1 3.5 1.4         0.2
2 4.9 3.0 1.4         0.2
3 4.7 3.2 1.3         0.2
> # 元素索引
> df[1, 1]  # 索引第一列第一个元素
[1] 5.1
> df$X1[1]  # 索引Sepal.Length列第一个元素
[1] 5.1
> df["X1"][1]  # 索引Sepal.Length列第一个元素
   X1
1 5.1
2 4.9
3 4.7
4 4.6
> # subset函数索引
> subset(df, X1 < 5)  # 按条件索引行  
   X1  X2  X3 Probability
2 4.9 3.0 1.4         0.2
3 4.7 3.2 1.3         0.2
4 4.6 3.1 1.5         0.2
> # sqldf函数索引
> library(sqldf)
> newdf <- sqldf("select * from mtcars where carb = 1 order by mpg", row.names = TRUE)
> newdf
                mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Valiant        18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Toyota Corona  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
Datsun 710     22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Fiat X1-9      27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
Fiat 128       32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
Toyota Corolla 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1


```r
> # 数据框编辑
> # 创建示例数据框
> data_iris <- data.frame(Sepal.Length = c(5.1, 4.9, 4.7, 4.6), 
+                         Sepal.Width = c(3.5, 3.0, 3.2, 3.1),
+                         Petal.Length = c(1.4, 1.4, 1.3, 1.5), 
+                         Pe.tal.Width = rep(0.2, 4))
> data_iris
  Sepal.Length Sepal.Width Petal.Length Pe.tal.Width
1          5.1         3.5          1.4          0.2
2          4.9         3.0          1.4          0.2
3          4.7         3.2          1.3          0.2
4          4.6         3.1          1.5          0.2
> # 增加新的样本数据
> (data_iris <- rbind(data_iris, list(5.0, 3.6, 1.4, 0.2)))
  Sepal.Length Sepal.Width Petal.Length Pe.tal.Width
1          5.1         3.5          1.4          0.2
2          4.9         3.0          1.4          0.2
3          4.7         3.2          1.3          0.2
4          4.6         3.1          1.5          0.2
5          5.0         3.6          1.4          0.2
> # 增加数据集的新属性变量
> (data_iris <- cbind(data_iris, Species = rep("setosa", 5)))
  Sepal.Length Sepal.Width Petal.Length Pe.tal.Width Species
1          5.1         3.5          1.4          0.2  setosa
2          4.9         3.0          1.4          0.2  setosa
3          4.7         3.2          1.3          0.2  setosa
4          4.6         3.1          1.5          0.2  setosa
5          5.0         3.6          1.4          0.2  setosa
> # 数据框的删除
> data_iris[, -1]  # 删除第一列
  Sepal.Width Petal.Length Pe.tal.Width Species
1         3.5          1.4          0.2  setosa
2         3.0          1.4          0.2  setosa
3         3.2          1.3          0.2  setosa
4         3.1          1.5          0.2  setosa
5         3.6          1.4          0.2  setosa
> data_iris[-1, ]  # 删除第一行
  Sepal.Length Sepal.Width Petal.Length Pe.tal.Width Species
2          4.9         3.0          1.4          0.2  setosa
3          4.7         3.2          1.3          0.2  setosa
4          4.6         3.1          1.5          0.2  setosa
5          5.0         3.6          1.4          0.2  setosa
> # 数据框列名的编辑
> names(data_iris)  # 查看数据框的列名
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Pe.tal.Width" "Species"     
> names(data_iris)[1] <- "sepal.length"  # 将数据框的第一列列名改为sepal.length
> names(data_iris)  # 查看修改后数据框的列名
[1] "sepal.length" "Sepal.Width"  "Petal.Length" "Pe.tal.Width" "Species"    



因子型向量操作

【我不理解】

# 2.2.5	示例:因子型向量的转换及创建
# 创建因子
# 将statistics分解为因子型向量,水平为26个小写字母
(ff <- factor(substring("statistics", 1:10, 1:10), levels = letters))  
# 去除没有包含在向量中的水平
(f. <- factor(ff))           
ff[, drop = TRUE]  # 等价于f. <- factor(ff)
# 创建因子型向量,水平名称为letter
factor(letters[1:20], labels = "letter")
# 创建有序的因子型向量
z <- factor(LETTERS[3:1], ordered = TRUE)  
z




# 2.2.5 	示例:创建不同水平的因子序列
# 创建因子序列
# 生成水平数为3,每个水平重复3次的因子序列
gl(3, 3)                
# 生成水平为“TRUE”和“FALSE”,每个水平重复3次的序列
gl(2, 3, labels = c("TRUE","FALSE"))  
# 生成水平数为2,序列长度为10的序列
gl(2, 1, 10)            
# 生成水平数为2,每个水平重复2次,序列长度为10的序列
gl(2, 2, 10)            
# 生成水平数为3,每个水平重复3次的有序因子序列
gl(3, 3, ordered = TRUE)  



# 2.2.5	示例:展示因子在R中的存储方式
# 因子存储方式
# 创建字符型向量
status <- c("Poor", "Improved", "Excellent", "Poor")  
class(status)  # 查看向量的类型
# 创建有序因子序列
status.factor <- factor(status, ordered = TRUE)     
class(status.factor)  # 查看数据的类型
storage.mode(status.factor)   
as.numeric(status.factor)  # 转化为数值型向量
levels(status.factor)  # 查看因子的水平

列表操作

【我不理解】

# 2.2.6  	示例:创建包含多种类型的向量的列表及内含多种结构的列表
# 创建列表
# 创建一个包含不同数据类型的向量的列表
data <- list(a = c(1, 2, 3, 4), b = c("one", "two", "three"), c = c(TRUE, FALSE),
             d = (1 + 2i))
data
summary(data)  # 查看列表的数据结构
# 创建一个内含多种结构的列表
g <- "My List"
h <- c(25, 26, 18, 39)
j <- matrix(1:10, nrow = 5)
# 创建一个包含字符串、向量、矩阵的列表
mylist <- list(title = g, ages = h, j)  
mylist  # 输出列表
summary(mylist)  # 查看列表的数据结构



# 2.2.6	示例:使用多种方式进行列表索引
# 列表索引
# 示例列表
data <- list(a = c(1, 2, 3, 4), b = c("one", "two", "three"), 
             c = c(TRUE, FALSE), d = (1 + 2i))
data
# 列索引
data[[1]]  # 索引第一列
data$a  # 索引列名称为a的列
data[["a"]]  # 索引列名称为a的列
# 元素索引
data[[1]][1]  # 索引第一列的第一个元素



# 2.2.6	示例:对列表进行合并及将列表转化为向量
# 列表编辑
# 示例列表
data <- list(a = c(1, 2,3 , 4), b = c("one", "two", "three"), 
             c = c(TRUE, FALSE), d = (1 + 2i))
data
# 增加名称为e的一列
(data1 <- c(data, list(e = c(5, 6, 7))))        
# 另外一种形式,与上面等价
(data2 <- c(data, e = list(c(5, 6, 7))))        
# 列表转化为向量
unlist(data1)

数据读写

# 键盘输入
# 创建一个指定模式但不含数据的变量
mydata <- data.frame(age = numeric(0), gender = character(0), weight = numeric(0))
# 键盘输入变量
mydata <- edit(mydata)
# 另外一种键盘输入的方法
fix(mydata)
# 使用RODBC读取xls文件
# 安装RODBC包
install.packages("RODBC")
# 加载RODBC包
library(RODBC)
# 建立RODBC连接对象至Excel文件,并将连接赋予一个对象,myfile.xls为文件路径
channel <- odbcConnectExcel("myfile.xls")   
# 读取工作簿中的工作表至一个数据框,mysheet为要读取的工作表名
mydataframe <- sqlFetch(channel, "mysheet")  
odbcClose(channel)  # 关闭RODBC连接

###########高阶的操作我看不懂了!####

# 2.3.4   R通过RODBC包访问数据库示例程序
# 访问SQL数据库示例程序
# 查看内存使用及清理R工作空间中的内存变量
gc()
rm(list = ls())
install.packages("RODBC")  # 安装RODBC包
library(RODBC)  # 载入RODBC包
# 通过一个数据源名称(mydsn)和用户名(user)以及密码(rply,如果没有设置,可以直接忽略)打开了一个ODBC数据库连接
mycon <- odbcConnect("mydsn", uid = "user", pwd = "rply")
# 将R自带的“USArrests”表写进数据库里
data(USArrests)
# 将数据流保存,这时打开SQL Server就可以看到新建的USArrests表
sqlSave(mycon, USArrests, rownames = "state", append = TRUE)
# 清除USArrests变量
rm(USArrests)
# 输出USArrests表中的内容
sqlFetch(mycon, "USArrests", rownames = "state")
# 对USArrests表执行了SQL语句select,并将结果输出
sqlQuery(mycon, "select * from USArrests")
# 删除USArrests表
sqlDrop(channel, "USArrests")
# 关闭连接
close(mycon)



# 2.3.5    示例:使用quantmod包抓取创梦天地每日的股票信息
# 利用quantmod包抓取股票数据
# 抓取创梦天地每日的股票信息
library(quantmod)
getSymbols("DSKY", scr = "yahoo")
# 查看最后六天的股票记录
tail(DSKY)
# 主绘图
chartSeries(DSKY, theme = "white")
# 三个基本图形
barChart(DSKY, theme = "white")  # 条形图
candleChart(DSKY, theme = "white")  # 蜡烛图
lineChart(DSKY, theme = "white")  # 线图
# 技术分析图
chartSeries(DSKY, theme = "white")
require(TTR)
addADX()  # 平均取向指标ADX
addATR()  # 平均真实波幅指标ART
addBBands()  # 布林线指标BBands
addCCI()  # 顺势指标CCI
addEMA()  # 指数平均指标EMA



# 2.3.5	示例:使用XML包抓取163体育频道中超栏目的网络表格数据
# XML包抓取网络表格数据
# readHTMLtable()函数
library(XML)
strurl <- 'http://sports.163.com/zc/'
tables <- readHTMLTable(strurl, header = FALSE, stringsAsFactors = FALSE)
# 解决中文乱码问题的方法:将数据导出到本地的txt文件,再重新导入即可:
table_sub <- tables[[1]]
write.table(table_sub, "table_sub.txt", row.names = F)
read.table("table_sub.txt", encoding = 'UTF-8', header = T)


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wency(王斯-CUEB)

我不是要饭的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值