1.基础
1.1包
#查看包的安装目录
print(.libPaths())
#查看已安装的包
#library()
#查看已载入的包
print(search())
# 例:安装 XML 包
#install.packages("XML", repos = "https://mirrors.ustc.edu.cn/CRAN/")
#查看是否安装成功:
#any(grepl("XML",installed.packages()))
[1] "C:/ProgramData/Anaconda3/Lib/R/library"
[1] ".GlobalEnv" "jupyter:irkernel" "package:stats"
[4] "package:graphics" "package:grDevices" "package:utils"
[7] "package:datasets" "package:methods" "Autoloads"
[10] "package:base"
1.2查看/修改当前工作目录
# 当前工作目录
print(getwd())
# 设置当前工作目录
setwd("E:/projectR_test")
# 查看当前工作目录
print(getwd())
[1] "E:/projectR_test"
[1] "E:/projectR_test"
1.3赋值、输出、查看/释放已定义变量
a.1=1
a.2<-2
a.3<<-3
4->a.4
5->>a.5
print(a.1)
print(a.2)
print(a.3)
print(a.4)
print(a.5)
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
“=和箭头“都可用于赋值,其中箭头总指向变量名
print()只能输出一个变量
print(ls())
rm(a.3)
print(ls())
[1] "a.1" "a.2" "a.3" "iris"
[1] "a.1" "a.2" "iris"
ls()用于查看已定义的变量
rm()用于释放已定义的变量
1.4写入/读取文件
cat(1, "加", 1, "等于", 2, '\n')
cat("\n")#可以作输出使用:如输出一个换行符
cat("content\n", file="F:/R_project_ben/file1.txt", append=TRUE)
1 加 1 等于 2
cat()用于拼接字符串
文件可以不存在,但是文件夹必须存在
此时是追加写入。若不加append,默认为false,覆盖写入
readLines("F:/R_project_ben/file1.txt") #读文件
‘content’
文件中每一行的行末必须有换行符\n
其他-----------------------------
注释:单行 ‘多行’ “多行”
1.5循环
a<-1
repeat{
a=a+1
print(a)
if(a>2)break
}
v <- LETTERS[1:4]
for ( i in v) {
print(i)
}
[1] 2
[1] 3
[1] "A"
[1] "B"
[1] "C"
[1] "D"
Jupyter只要运行一次无限循环,点击中断服务也没用,必须重启
while类似于其他语言
next类似于continue
LETTERS内置向量
1.6判断:if;switch;
x <- switch(
3,
"google",
"runoob",
"taobao",
"weibo"
)
print(x)
you.like<-"runoob"
switch(you.like, google="www.google.com", runoob = "www.runoob.com", taobao = "www.taobao.com")
[1] "taobao"
‘www.runoob.com’
switch()的第一个参数如果是数字,返回后面的值,此时返回第三个
如果是字符串,返回字符串对应的值
2.函数、内置函数、显示格式控制
2.1函数
func1 <- function(a) {
print(a)
}
# 调用函数,并传递参数
func1(6)
[1] 6
R语言对于计算是懒惰的,即使调用时没有传参,如果函数内没有使用也不会报错
2.2数学函数
#三角函数:弧度制
print(sin(pi/6))
print(cos(pi/4))
print(tan(pi/3))
#反三角函数
print(asin(0.5))
print(acos(0.7071068))
print(atan(1.732051))
[1] 0.5
[1] 0.7071068
[1] 1.732051
[1] 0.5235988
[1] 0.7853981
[1] 1.047198
print(sqrt(4))
print(exp(1))#e的n次方
print(log(2,4))#后面的是底数
print(log10(100))#默认底数为10
print(ceiling(1.9))#向上取整
print(floor(2.1))#向下取整
print(7%%2)#整除求余
print(7%/%2)#整除
#求最值
print(max(1:5))
print(min(1:5))
print(sum(1:5))
print(mean(1:5))#平均值
print(sd(1:5))#标准差
print(var(1:5))#方差
print(range(1:5))#取值范围
[1] 2
[1] 2.718282
[1] 0.5
[1] 2
[1] 2
[1] 2
[1] 1
[1] 3
[1] 5
[1] 1
[1] 15
[1] 3
[1] 1.581139
[1] 2.5
[1] 1 5
#round(n)四舍五入取整
print(round(1.5))
print(round(1.4))
#round(m,n)保留n位小数四舍五入
print(round(1.522222,2))
print(round(1.566666,2))
# format(m,n)一共显示n位,四舍五入
result <- format(23.123456789, digits = 4)
print(result)
[1] 2
[1] 1
[1] 1.52
[1] 1.57
[1] "23.12"
2.3字符串、向量相关
print(toupper("Runoob")) # 转换为大写
print(tolower("Runoob")) # 转换为小写
print(nchar("中文", type="bytes")) # 统计字节长度
print(nchar("中文", type="char")) # 总计字符数量
# 截取字符串,从 1 到 5
print(substr("123456789", 1, 5))
print(substring("123456789", 1, 5))
print(substring("1234567890", 5)) # 截取字符串,从 5 到结束
print(as.numeric("12")) # 将字符串转换为数字
print(as.character(12.34)) # 将数字转换为字符串
# 将数字转为字符串
result <- format(6)
print(result)
print(strsplit("2019;10;1", ";")) # 分隔符拆分字符串
print(gsub("/", "-", "2019/10/1")) # 替换字符串
[1] "RUNOOB"
[1] "runoob"
[1] 4
[1] 2
[1] "12345"
[1] "12345"
[1] "567890"
[1] 12
[1] "12.34"
[1] "6"
[[1]]
[1] "2019" "10" "1"
[1] "2019-10-1"
#nchar(x)计算(列表)或字符串的长度
result <- nchar("Google Runoob Taobao")
print(result)
[1] 20
# 宽度为 6 位,不够的在开头添加空格
result <- format(13.7, width = 6)
print(result)
# 左对齐字符串
result <- format("Runoob", width = 9, justify = "l")
print(result)
# 居中显示
result <- format("Runoob", width = 10, justify = "c")
print(result)
# 使用科学计数法显示
result <- format(c(6, 13.14521), scientific = TRUE)
print(result)
# 小数点右边最小显示 5 位,没有的以 0 补充
result <- format(23.47, nsmall = 5)
print(result)
[1] " 13.7"
[1] "Runoob "
[1] " Runoob "
[1] "6.000000e+00" "1.314521e+01"
[1] "23.47000"
3.六种数据类型
3.1向量vector赋值;某元素是否存在;向量的计算(对每个数字单独计算);取出部分项;向量的排序
#求向量的维度
result<-length(c(1,2,3))
print(result)
[1] 3
#向量的生成
v1 <- c(3,1,TRUE,"runoob")
print(v1)
v2 <- c(3,1,2,5)
print(v2)
print(seq(1, 9, 2))#生成从1-9,差为2的等差序列
print(seq(0, 1, length.out=3))#生成从0到1,个数为3的等差数列
print(rep(0, 5))#生成全部元素重复的向量
[1] "3" "1" "TRUE" "runoob"
[1] 3 1 2 5
[1] 1 3 5 7 9
[1] 0.0 0.5 1.0
[1] 0 0 0 0 0
c() 是一个创造向量的函数。
如果参数中有字符串,c()将其中的每一项都用双引号包裹拼接起来,共同赋值给一个变量
如果都是数字,就不包裹
vector1 <- c(1,2,3,4,5)
flag=2%in%vector1
print(flag)
vector<-1:3
flag2=7%in%vector1
print(flag2)
[1] TRUE
[1] FALSE
%in%:用于判断元素是否在向量里,返回布尔值
以上是一维向量赋值的两种方法
a = c(3, 4)
b = c(5, 0)
print(a + b)
print(c(1.1, 1.2, 1.3) - 0.5)
a = c(1,2)
print(a ^ 2)
[1] 8 4
[1] 0.6 0.7 0.8
[1] 1 4
print(a[1:4]) # 取出第 1 到 4 项,包含第 1 和第 4 项
print(a[c(1, 3, 5)]) # 取出第 1, 3, 5 项
print(a[c(-1, -5)]) # 去掉第 1 和第 5 项
[1] 1 2 NA NA
[1] 1 NA NA
[1] 2
a = c(1, 3, 5, 2, 4, 6)
print(sort(a,decreasing=TRUE))#递增排序,返回排序后的值
print(rev(a))#向量逆转
print(order(a))#递增排序,返回的是原先的下标
print(a[order(a)])
[1] 6 5 4 3 2 1
[1] 6 4 2 5 3 1
[1] 1 4 2 5 3 6
[1] 1 2 3 4 5 6
其他
- NA占位置,无值,算长度。NULL相当于不存在
- 向量可以和数字加减、比大小、
- which(条件)可以删选满足条件的下标
- all() 用于检查逻辑向量是否全部为 TRUE,any() 用于检查逻辑向量是否含有 TRUE
3.2创建矩阵matrix;矩阵转置;矩阵相乘%*%;矩阵乘除 */;求逆矩阵;矩阵按整行整列操作
#创建矩阵方法1;矩阵转置;矩阵相乘%*%;
M = matrix( c(2,6,5,1,10,4), nrow = 2,ncol = 3,byrow = TRUE)
print(M)
print(t(M))
t = M %*% t(M)
print(t)
#输出第二列
print(M[,2])
[,1] [,2] [,3]
[1,] 2 6 5
[2,] 1 10 4
[,1] [,2]
[1,] 2 1
[2,] 6 10
[3,] 5 4
[,1] [,2]
[1,] 65 82
[2,] 82 117
[1] 6 10
#矩阵乘除 */
# 创建 2 行 3 列的矩阵
matrix1 <- matrix(c(7, 9, -1, 4, 2, 3), nrow = 2)
print(matrix1)
matrix2 <- matrix(c(6, 1, 0, 9, 3, 2), nrow = 2)
print(matrix2)
# 两个矩阵相乘---对应项相乘
result <- matrix1 * matrix2
cat("相乘结果:","\n")
print(result)
# 两个矩阵相除---对应项相除
result <- matrix1 / matrix2
cat("相除结果:","\n")
print(result)
[,1] [,2] [,3]
[1,] 7 -1 2
[2,] 9 4 3
[,1] [,2] [,3]
[1,] 6 0 3
[2,] 1 9 2
[,1] [,2] [,3]
[1,] 42 0 6
[2,] 9 36 6
[,1] [,2] [,3]
[1,] 1.166667 -Inf 0.6666667
[2,] 9.000000 0.4444444 1.5000000
%*% 用于矩阵与它转置的矩阵相乘。
但我认为,t(M)是M的转置,%*%是矩阵相乘
二维矩阵赋值:直接按行输入,指定行列数,byrow=true指按行优先赋值
#创建矩阵的方法2
M = matrix( c(2,6,5,1,10,4), nrow = 2,ncol = 3,byrow = TRUE)
colnames(M) = c("x", "y", "z")
rownames(M) = c("a", "b")
print(M)
print(M["a", ])#按照行列名输出元素
x y z
a 2 6 5
b 1 10 4
x y z
2 6 5
#求逆矩阵
M = matrix( c(1,2,3,4), nrow = 2,ncol = 2,byrow = TRUE)
solve(M)
-2.0 | 1.0 |
1.5 | -0.5 |
#矩阵按整行整列操作
(A = matrix(c(1, 3, 2, 4), 2, 2))
print(A)
print(apply(A, 1, sum)) # 第二个参数为 1 按行操作,用 sum() 函数
print(apply(A, 2, sum)) # 第二个参数为 2 按列操作
1 | 2 |
3 | 4 |
[,1] [,2]
[1,] 1 2
[2,] 3 4
[1] 3 7
[1] 4 6
3.3数组array(3维)创建数组;数组按整行整列操作;
#创建数组
# 创建两个不同长度的向量
vector1 <- c(5,9)
vector2 <- c(10,11,12,6)
column.names <- c("COL1","COL2","COL3")
row.names <- c("ROW1","ROW2")
matrix.names <- c("Matrix1","Matrix2")
# 创建一个2行3列2层数组,并设置各个维度的名称
#向量长为6,只够一层矩阵赋值,默认采取循环赋值的方法,于是两层的值相同
result <- array(c(vector1,vector2),dim = c(2,3,2),dimnames = list(row.names,column.names,matrix.names))
print(result)
print(result[2,,2])#2行全部列第2层矩阵
, , Matrix1
COL1 COL2 COL3
ROW1 5 10 12
ROW2 9 11 6
, , Matrix2
COL1 COL2 COL3
ROW1 5 10 12
ROW2 9 11 6
COL1 COL2 COL3
9 11 6
赋值的同时,使用 dimnames指定各个维度的名称
array()第一个参数是全部的数据元素,第二个参数表示数组的维度,数组被认为是由多个矩阵堆砌而成
.和类无关,相当于下滑线
对数组的某几层矩阵加减乘除时,先将该层矩阵取出
# 创建数组
new.array <- array(c(c(5,9,3),c(10,11,12,13,14,15)),dim = c(3,3,2))
print(new.array)
# 计算数组中所有矩阵每一行的数字之和
result <- apply(new.array, 1, sum)
print(result)
# 计算数组中所有矩阵每一列的数字之和
result <- apply(new.array, 2, sum)
print(result)
, , 1
[,1] [,2] [,3]
[1,] 5 10 13
[2,] 9 11 14
[3,] 3 12 15
, , 2
[,1] [,2] [,3]
[1,] 5 10 13
[2,] 9 11 14
[3,] 3 12 15
[1] 56 68 60
[1] 34 66 84
3.4列表list:增删改列表;合并列表;列表转向量
# 创建列表包含向量、矩阵、列表
list_data <- list(c("Google","Runoob","Taobao"), matrix(c(1,2,3,4,5,6), nrow = 2),list("runoob",12.3))
# 给列表元素设置名字
names(list_data) <- c("Sites", "Numbers", "Lists")
# 显示列表
print(list_data)
# 访问列表元素
print(list_data[1])
print(list_data$Numbers)
# 添加元素
list_data[4] <- "新元素"
print(list_data[4])
# 删除元素
list_data[4] <- NULL
print(list_data[4])
$Sites
[1] "Google" "Runoob" "Taobao"
$Numbers
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
$Lists
$Lists[[1]]
[1] "runoob"
$Lists[[2]]
[1] 12.3
$Sites
[1] "Google" "Runoob" "Taobao"
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
[[1]]
[1] "新元素"
$<NA>
NULL
# 合并列表
merged.list <- c(list(1,2,3),list("Google","Runoob","Taobao"))
print(merged.list)
#unlist()列表转换为向量
v1 <- unlist(list(1,2,3))
print(v1)
[[1]]
[1] 1
[[2]]
[1] 2
[[3]]
[1] 3
[[4]]
[1] "Google"
[[5]]
[1] "Runoob"
[[6]]
[1] "Taobao"
[1] 1 2 3
3.5因子factor???不太明白
#新建一个因子,类似于一个统计表格中的一整列
sex<-factor(c('male','female','male'))
#查看变量类型
print(class(sex))
#判断某变量是否为因子
print(is.factor(sex))
#查看因子中具体有哪些类型
print(levels(sex))
#查看因子中有几个类
print(nlevels(sex))
[1] "factor"
[1] TRUE
[1] "female" "male"
[1] 2
#???????????????
#label就是给levels对应位置起名字
fruit=factor(c('apple','pear','banana','apple'),levels=c('apple','pear','banana'),labels=c('苹果','梨','香蕉'),ordered=TRUE)
print(fruit)
[1] 苹果 梨 香蕉 苹果
Levels: 苹果 < 梨 < 香蕉
3.6数据框data.frame(表格)
3.6.1创建数据框;多种方式输出数据框;添加列;
#同一列的数据类型需要一致,不同列的数据类型可以不一样
table = data.frame(
姓名 = c("张三", "李四"),
工号 = c("001","002"),
月薪 = c(1000, 2000)
)
print(table) # 查看 table 数据
str(table)# 查看 table 数据
print("---显示概要----")
print(summary(table))
print("---提取指定的列----")
result <- data.frame(table$姓名,table$月薪)
print(result)
print("---输出前面1行----")
result <- table[1,]
print(result)
print("---输出前面两列----")
result <- table[,1:2]
print(result)
print("---输出前面两列----")
result <- table[,c(1,2)]
print(result)
姓名 工号 月薪
1 张三 001 1000
2 李四 002 2000
'data.frame': 2 obs. of 3 variables:
$ 姓名: Factor w/ 2 levels "李四","张三": 2 1
$ 工号: Factor w/ 2 levels "001","002": 1 2
$ 月薪: num 1000 2000
[1] "---显示概要----"
姓名 工号 月薪
李四:1 001:1 Min. :1000
张三:1 002:1 1st Qu.:1250
Median :1500
Mean :1500
3rd Qu.:1750
Max. :2000
[1] "---提取指定的列----"
table.姓名 table.月薪
1 张三 1000
2 李四 2000
[1] "---输出前面1行----"
姓名 工号 月薪
1 张三 001 1000
[1] "---输出前面两列----"
姓名 工号
1 张三 001
2 李四 002
[1] "---输出前面两列----"
姓名 工号
1 张三 001
2 李四 002
table = data.frame(
姓名 = c("张三", "李四","王五"),
工号 = c("001","002","003"),
月薪 = c(1000, 2000,3000)
)
# 添加列
table$部门 <- c("运营","技术","编辑")
print(table)
姓名 工号 月薪 部门
1 张三 001 1000 运营
2 李四 002 2000 技术
3 王五 003 3000 编辑
3.6.2向量合并成数据框;
#向量合并成数据框
sites <- c("Google","Runoob","Taobao")
likes <- c(222,111,123)
url <- c("www.google.com","www.runoob.com","www.taobao.com")
# 将向量组合成数据框
addresses <- cbind(sites,likes,url)#如果两个向量用rbind
# 查看数据框
print(addresses)
sites likes url
[1,] "Google" "222" "www.google.com"
[2,] "Runoob" "111" "www.runoob.com"
[3,] "Taobao" "123" "www.taobao.com"
3.6.3表格疑惑中…
# data frame 1
df1 = data.frame(SiteId = c(1:6), Site = c("Google","Runoob","Taobao","Facebook","Zhihu","Weibo"))
print("----- 表1 ------")
print(df1)
# data frame 2
df2 = data.frame(SiteId = c(2, 4, 6, 7, 8), Country = c("CN","USA","CN","USA","IN"))
print("----- 表2 ------")
print(df2)
# INNER JOIN:内连接 对相同的SiteId,融合信息
df1 = merge(x=df1,y=df2,by="SiteId")
print("----- 内连接 -----")
print(df1)
# FULL JOIN:全连接
df2 = merge(x=df1,y=df2,by="SiteId",all=TRUE)
print("----- 全连接 -----")
print(df2)
# LEFT JOIN:左连接
df3 = merge(x=df1,y=df2,by="SiteId",all.x=TRUE)
print("----- 左连接 -----")
print(df3)
# RIGHT :右连接
df4 = merge(x=df1,y=df2,by="SiteId",all.y=TRUE)
print("----- 右连接 -----")
print(df4)
[1] "----- 表1 ------"
SiteId Site
1 1 Google
2 2 Runoob
3 3 Taobao
4 4 Facebook
5 5 Zhihu
6 6 Weibo
[1] "----- 表2 ------"
SiteId Country
1 2 CN
2 4 USA
3 6 CN
4 7 USA
5 8 IN
[1] "----- 内连接 -----"
SiteId Site Country
1 2 Runoob CN
2 4 Facebook USA
3 6 Weibo CN
[1] "----- 全连接 -----"
SiteId Site Country.x Country.y
1 2 Runoob CN CN
2 4 Facebook USA USA
3 6 Weibo CN CN
4 7 <NA> <NA> USA
5 8 <NA> <NA> IN
[1] "----- 左连接 -----"
SiteId Site.x Country Site.y Country.x Country.y
1 2 Runoob CN Runoob CN CN
2 4 Facebook USA Facebook USA USA
3 6 Weibo CN Weibo CN CN
[1] "----- 右连接 -----"
SiteId Site.x Country Site.y Country.x Country.y
1 2 Runoob CN Runoob CN CN
2 4 Facebook USA Facebook USA USA
3 6 Weibo CN Weibo CN CN
4 7 <NA> <NA> <NA> <NA> USA
5 8 <NA> <NA> <NA> <NA> IN
3.6.4melt() :宽格式数据转化成长格式。cast() :长格式数据转化成宽格式。
# melt() 和 cast() 函数
# 安装库(安装一次注释掉就行了)
#install.packages("MASS", repos = "https://mirrors.ustc.edu.cn/CRAN/")
#install.packages("reshape2", repos = "https://mirrors.ustc.edu.cn/CRAN/")
#install.packages("reshape", repos = "https://mirrors.ustc.edu.cn/CRAN/")
# 载入库
#library(MASS)
library(reshape2)
library(reshape)
# 创建数据框
id<- c(1, 1, 2, 2)
time <- c(1, 2, 1, 2)
x1 <- c(5, 3, 6, 2)
x2 <- c(6, 5, 1, 4)
mydata <- data.frame(id, time, x1, x2)
# 原始数据框
cat("原始数据框:\n")
print(mydata)
# 整合
md <- melt(mydata, id = c("id","time"))
cat("\n整合后:\n")
print(md)
原始数据框:
id time x1 x2
1 1 1 5 6
2 1 2 3 5
3 2 1 6 1
4 2 2 2 4
整合后:
id time variable value
1 1 1 x1 5
2 1 2 x1 3
3 2 1 x1 6
4 2 2 x1 2
5 1 1 x2 6
6 1 2 x2 5
7 2 1 x2 1
8 2 2 x2 4
# 载入库
#library(MASS)
library(reshape2)
library(reshape)
# 创建数据框
id<- c(1, 1, 2, 2)
time <- c(1, 2, 1, 2)
x1 <- c(5, 3, 6, 2)
x2 <- c(6, 5, 1, 4)
mydata <- data.frame(id, time, x1, x2)
print("原始数据框---------")
print(mydata)
# 整合
#除了选中的列,其他列都变成了度量变量variable的取值
md <- melt(mydata, id = c("id","time"))
print("整合后的数据-------------")
print(md)
# ~之前的列去重,~之后的列要列出属性值,cast()会整合~后面所有取值下的value情况,mean代表每一项取均值
cast.data <- cast(md, id~variable, mean)
print("id~variable-------------")
print(cast.data)
time.cast <- cast(md, time~variable, mean)
print("time~variable------------")
print(time.cast)
id.time <- cast(md, id~time, mean)
print("id~time-----------")
print(id.time)
id.time.cast <- cast(md, id+time~variable)
print("id+time~variable-----------")
print(id.time.cast)
id.variable.time <- cast(md, id+variable~time)
print("id+variable~time-----------")
print(id.variable.time)
id.variable.time2 <- cast(md, id~variable+time)
print("id~variable+time-----------")
print(id.variable.time2)
#作业补充:
#对于一个有多个列的数据框,如果要查看某两列的相关关系,可以如下处理:(数据文件中必须有id列,没有的手动添加,值从1递增)
#现将这两列除外(class和cap.shape是列名)融合,其他的列统统当成度量变量
#md <- melt(data, id = c("id","class","cap.shape"))
#print(md)
#整合,中间的数据全为统计值,(我的统计值是真实个数的某个倍数,可能是度量向量的个数倍)
#cast.data <- cast(md, class~cap.shape)
#print(cast.data)
[1] "原始数据框---------"
id time x1 x2
1 1 1 5 6
2 1 2 3 5
3 2 1 6 1
4 2 2 2 4
[1] "整合后的数据-------------"
id time variable value
1 1 1 x1 5
2 1 2 x1 3
3 2 1 x1 6
4 2 2 x1 2
5 1 1 x2 6
6 1 2 x2 5
7 2 1 x2 1
8 2 2 x2 4
[1] "id~variable-------------"
id x1 x2
1 1 4 5.5
2 2 4 2.5
[1] "time~variable------------"
time x1 x2
1 1 5.5 3.5
2 2 2.5 4.5
[1] "id~time-----------"
id 1 2
1 1 5.5 4
2 2 3.5 3
[1] "id+time~variable-----------"
id time x1 x2
1 1 1 5 6
2 1 2 3 5
3 2 1 6 1
4 2 2 2 4
[1] "id+variable~time-----------"
id variable 1 2
1 1 x1 5 3
2 1 x2 6 5
3 2 x1 6 2
4 2 x2 1 4
[1] "id~variable+time-----------"
id x1_1 x1_2 x2_1 x2_2
1 1 5 3 6 5
2 2 6 2 1 4
4.可以转换成数据框、列表处理的文件
4.1CSV文件,返回数据框:获取/更改工作目录;判断是否为数据框;查看数据框行列数;subset()按条件查找记录;写入CSV文件;
#获取当前工作目录
print(getwd())
#更改当前工作目录
setwd("F:/R_project_ben")
#CSV 用逗号来分割列,并且 CSV 文件最后一行需要保留一个空行,不然执行程序会有警告信息。
#读取文件,返回的是数据框
data<-read.csv("test.csv")
print(data)
# 查看是否是数据框
print(is.data.frame(data))
print(ncol(data)) # 列数
print(nrow(data)) # 行数
# 查找likes 大于 1 name 为 Runoob 的数据
retval <- subset(data, likes > 1 & name=="菜鸟")
print(retval)
#将记录写入一个新的csv文件
write.csv(retval,"runoob.csv")
newdata <- read.csv("runoob.csv")
print(newdata)
#将记录写入一个新的csv文件的同时,删除某一列
write.csv(retval,"runoob.csv", row.names = FALSE)
newdata <- read.csv("runoob.csv")
print(newdata)
[1] "F:/R_project_ben"
id name url likes
1 1 谷歌 www.google.com 111
2 2 菜鸟 www.runoob.com 222
3 3 淘宝 www.taobao.com 333
[1] TRUE
[1] 4
[1] 3
id name url likes
2 2 菜鸟 www.runoob.com 222
X id name url likes
1 2 2 菜鸟 www.runoob.com 222
id name url likes
1 2 菜鸟 www.runoob.com 222
4.2XML文件:统计数据条数;转为列表;转为数据框;
# 安装 XML 包
#install.packages("XML", repos = "https://mirrors.ustc.edu.cn/CRAN/")
#查看是否安装成功:
any(grepl("XML",installed.packages()))
# 载入 XML 包
library("XML")
# 打开同目录下xml文件
result <- xmlParse(file = "test.xml")
print(result)
#统计一共有多少条数据
rootnode <- xmlRoot(result)# 提取根节点,并且可以看做矩阵
rootsize <- xmlSize(rootnode)# 统计数据量
print(rootsize)
print("---------------------------")
# 查看第 2 个节点数据
print(rootnode[2])
print("---------------------------")
# 查看第 2 个节点的第 1 个数据
print(rootnode[[2]][[1]])
print("---------------------------")
# 转为列表
xml_data <- xmlToList(result)
print(xml_data)
print(xml_data[[1]][[2]])#列表也可以像矩阵一样读取
#转为数据框
xmldataframe <- xmlToDataFrame(result)#或xmldataframe <- xmlToDataFrame("test.xml")
print(xmldataframe)
TRUE
<?xml version="1.0"?>
<sites>
<site>
<id>1</id>
<name>Google</name>
<url>www.google.com</url>
<likes>111</likes>
</site>
<site>
<id>2</id>
<name>Runoob</name>
<url>www.runoob.com</url>
<likes>222</likes>
</site>
<site>
<id>3</id>
<name>Taobao</name>
<url>www.taobao.com</url>
<likes>333</likes>
</site>
</sites>
[1] 3
[1] "---------------------------"
$site
<site>
<id>2</id>
<name>Runoob</name>
<url>www.runoob.com</url>
<likes>222</likes>
</site>
attr(,"class")
[1] "XMLInternalNodeList" "XMLNodeList"
[1] "---------------------------"
<id>2</id>
[1] "---------------------------"
$site
$site$id
[1] "1"
$site$name
[1] "Google"
$site$url
[1] "www.google.com"
$site$likes
[1] "111"
$site
$site$id
[1] "2"
$site$name
[1] "Runoob"
$site$url
[1] "www.runoob.com"
$site$likes
[1] "222"
$site
$site$id
[1] "3"
$site$name
[1] "Taobao"
$site$url
[1] "www.taobao.com"
$site$likes
[1] "333"
[1] "Google"
id name url likes
1 1 Google www.google.com 111
2 2 Runoob www.runoob.com 222
3 3 Taobao www.taobao.com 333
4.3json:可以转换为数据框
#安装json
#install.packages("rjson", repos = "https://mirrors.ustc.edu.cn/CRAN/")
# 载入 rjson 包
library("rjson")
# 获取 json 数据
result <- fromJSON(file = "test.json")
print(result)
print("-----获取第 1 行------")
print(result[1])
print("-----获取第 2 行第 2 列------")
print(result[[2]][[2]])
# 转为数据框
json_data_frame <- as.data.frame(result)
print(json_data_frame)
$id
[1] "1" "2" "3"
$name
[1] "Google" "Runoob" "Taobao"
$url
[1] "www.google.com" "www.runoob.com" "www.taobao.com"
$likes
[1] 111 222 333
[1] "-----获取第 1 行------"
$id
[1] "1" "2" "3"
[1] "-----获取第 2 行第 2 列------"
[1] "Runoob"
id name url likes
1 1 Google www.google.com 111
2 2 Runoob www.runoob.com 222
3 3 Taobao www.taobao.com 333
a <- "Google"
b <- 'Runoob'
c <- "Taobao"
#默认空格拼接
print(paste(a,b,c))
#指定符号拼接
print(paste(a,b,c, sep = "-"))
#指定符号拼接且编号
print(paste(letters[1:6],1:6, sep = "", collapse = "="))
[1] "Google Runoob Taobao"
[1] "Google-Runoob-Taobao"
[1] "a1=b2=c3=d4=e5=f6"
5.绘图
5.1字体:下面用到family='字体’时,先执行此段代码,再在该文件中showtext_begin();
#install.packages("showtext", repos = "https://mirrors.ustc.edu.cn/CRAN/") # 安装 showtext
library(showtext)
# font_files() # 查看windows支持的字体
#使用之前要先将字体加入
font_add('Arial', 'arial.ttf')
5.2饼图 pie();pie3D();
#直接绘图
info = c(1, 2, 4, 8)#数据准备,注意:必须是数字
names = c("Google", "Runoob", "Taobao", "Weibo")# 在饼图上显示的文字
cols = c("#ED1C24","#22B14C","#FFC90E","#3f48CC")# 涂色
pie(info, labels=names, col=cols,, main = "网站分析")# 绘图
legend("topright", names, cex=0.8, fill=cols)# 添加颜色样本标注
#csv文件统计后绘图
#方法1
#data<-read.csv("Mushroom.csv")
#pie(table(data[,2]))
#方法2
#m=lapply(data,function (x) table(x)/length(x))
#pie(m$列名)
#3D饼图
#install.packages("plotrix", repos = "https://mirrors.ustc.edu.cn/CRAN/")
# 载入 plotrix
library(plotrix)
# 绘制 3D 图,family 要设置你系统支持的中文字体库
pie3D(info,labels = names,explode = 0.1, main = "3D 图")
5.3条形图barplot():数据可以是向量,也可以是矩阵
# 准备一个向量
cvd19 = c(1,3,2)
# 显示条形图
barplot(cvd19,main="新冠疫情条形图",col=c("#ED1C24","#22B14C","#FFC90E"),names.arg=c("中国","美国","印度"))
#创建一个矩阵
cvd19 = matrix(c(83017, 83534, 1794546, 2640626, 190535, 585493),2, 3)
#加载字体
showtext_begin();
colnames(cvd19) = c("中国", "美国", "印度")
rownames(cvd19) = c("6月", "7月")
barplot(cvd19, main = "新冠疫情条形图", beside=TRUE, legend=TRUE,col=c("blue","green"), family='Arial')
# 去掉字体
showtext_end();
5.4函数图像curve();plot():简单函数;分段函数;折线图;散点图;散点图矩阵pairs();
#参数为:函数表达式,区间
curve(sin(x), -2 * pi, 2 * pi)
#对分段函数绘图
# 定义函数 f
f = function (x) {
if (x >= 0) {
x
} else {
x ^ 2
}
}
x = seq(-2, 2, length=100)# 生成自变量序列:从-2~ 2,长度为100的等差序列
y = rep(0, length(x))# 生成因变量序列:全部元素重复的向量
j = 1
for (i in x) {
y[j] = f(i)
j = j + 1
}
# 绘制图像:type:绘图的类型,p 为点、l 为直线, o 同时绘制点和线,且线穿过点
plot(x, y, type='l')
#折线图、散点图
# 只给一个向量:#只给一个向量,默认为纵坐标,横坐标默认为1,2,3....
v <- c(7,12,28,3,41)
# 绘图、线图颜色为红色,main 参数用于设置标题
#type:绘图的类型,p 为点、l 为直线, o 同时绘制点和线,且线穿过点
plot(v,type = "l", col = "red", xlab = "Month", ylab = "Rain fall",main = "Rain fall chart")
plot(v,type = "o")
plot(v,type = "p")
#给x,y两个向量
x<-c(10,30,40,45)
y<-c(20,40,60,25)
plot(x, y, "p")
# 利用内置数据集生成散点图
input <- mtcars[,c('wt','mpg')]
# 设置坐标 x 轴范围 2.5 到 5, y 轴范围 15 到 30.
plot(x = input$wt,y = input$mpg,
xlab = "Weight",
ylab = "Milage",
xlim = c(2.5,5),
ylim = c(15,30),
main = "Weight vs Milage"
)
# 4 个变量绘制矩阵,12 个图(暂不明白意义何在)
pairs(~wt+mpg+disp+cyl,data = mtcars, main = "Scatterplot Matrix")