R语言学习笔记

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

其他

  1. NA占位置,无值,算长度。NULL相当于不存在
  2. 向量可以和数字加减、比大小、
  3. which(条件)可以删选满足条件的下标
  4. 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")

来源:https://www.icode9.com/content-4-893501.html

(0)

相关推荐

  • 【R分享|实战】科白君教你相关性分析及其绘图

    "R实战"专题·第7篇   编辑 | 科白维尼   1898字 | 4分钟阅读 本期推送内容 相关性分析通常用来定量描述两个变量之间的联系,正相关?负相关?不存在相关?等.常见相关 ...

  • 《R语言实战》- 牛国庆

    [toc] 第一章 1.3.2 R中帮助函数 R中用于管理R工作空间的函数 函数setwd()不会自动创建一个不存在的目录.如果必要的话,可以使用函数dir.create()来创建新目录,然后使用se ...

  • python基本数据结构

    文章目录 列表list 访问列表中的值 更新列表 删除列表元素 列表脚本操作符 列表截取与拼接 嵌套列表 直接赋值 浅拷贝 深拷贝 列表函数&方法 列表函数 **sorted(iterable ...

  • 第12天:Python 集合

    Python也包含有 集合 类型.集合是由不重复元素组成的无序的集.它的基本用法包括成员检测和消除重复元素.集合对象也支持像 联合,交集,差集,对称差分等数学运算. 集合结构如下: set1 = {' ...

  • R语言学习笔记(四):apply,sapply,lapply,tapply,vapply以及mapply的用法

    apply() apply(m,dimcode,f,fargs) m 是一个矩阵. dimcode是维度编号,取1则为对行应用函数,取2则为对列运用函数. f是函数 fargs是f的可选参数集 > ...

  • 那些年倒腾的R语言学习笔记,全都在这里了~

    今天这一篇整理一下我以往推送过的所有R语言相关文章,一来是方便大家的检索,二来也是阶段性学习的一次总结. 关于内容分类,我分成了学习心得篇.R语言基础.数据可视化.网络数据爬取,然后各自类别进行详细的 ...

  • ​​​​R语言学习笔记(五)——曼哈顿图

    iJournal 学术期刊信息查询 386篇原创内容 Official Account  ↑ ↑  关注iJournal,选刊快人一步  ↑ ↑  iJournal后台回复"2021学科&q ...

  • 零基础R语言学习路线

    其实相对于常见的编程语言,R语言还是非常容易上手.学习1年多时间,就可以找一份不错的工作了. 前言 我当初学习R的时候在网上搜到一则流传很广的R语言学习路线图(R语言学习由浅入深路线图),我在微信圈, ...

  • R语言学习小感悟

    最近看了看<R数据科学>(即R for data science的中文版)和<R语言-实用数据分析和可视化技术>(即R for Everyone Advanced Analyt ...

  • 【Go语言学习笔记一】基础语法

    行分隔行 在 Go 程序中,一行代表一个语句结束.每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾, 但是可以使用分号:结尾,如果当你将多个语句写在同一行时,则必须使用分号: 一.变量 1. ...

  • Rust语言学习笔记(11)

    作者:@zwvista 本文为作者原创,转载请注明出处:https://www.cnblogs.com/zwvista/p/12758683.html 目录 Rust 2015 vs Rust 201 ...

  • R语言读书笔记以及为什么发读书笔记

    昨天发布了生信人必备书单,大家的反响比较热烈,褒贬不一! 生信人必备书单 其实吧,就像我自己评价的那样: 我再次强调一下,我会的所有知识,我都看过5本以上的书,甚至把一本书看五遍,这个我觉得没有任何难 ...

  • R语言学习入门导航-特别版

      jimmy导读 英雄帖发出之后,有新朋友加入,也有老朋友捧场,看样子88篇生物信息学优秀博客合集的小目标近在眼前了. 诚邀您加盟,生信技能树 生信土豆侠的-人体解剖医学包-gganatogram的 ...