TASK1.2 R语言的数据类型与数据结构
1 预习(设置工作路径、尝试读取数据)
2 课堂内容(汇总函数、基本数据类型、数据结构)
1 预习
1.1设置工作路径
我们可以通过
- getwd() 获取当前工作路径
设置工作路径的两种方法:
1 暂时
- setwd()
- setwd("E:/vvang/Documents/Rstudio/guanghuaBA_workshop/TASK1.2")
2 永久
Tools -> Global option -> General -> Default working directory
1.2 尝试读取数据
给出了csv、txt、xlsx的数据,下面分别读取
1.2.1 读取csv数据 (read.csv)
data_csv = read.csv("top250.csv")
发现报错“Error in type.convert.default(data[[i]], as.is = as.is[i], dec = dec, : invalid multibyte string at '<b8><a5><c0><bc>'”
考虑可能是编码问题,先是改为-
data_csv = read.csv("top250.csv", fileEncoding = 'UTF-8')
发现还有报错: data_csv = read.csv("top250.csv", fileEncoding = 'GBK')
但是后来发现改成这样也可以,可能是因为:GBK包含全部中文字符;UTF-8则包含全世界所有国家需要用到的字符。
具体可参考:
一些函数里的arguments这里不再展开,以后直接?打开help
1.2.2 读取txt数据 (read.table)
-
data_txt = read.table("top250.txt", header = T, sep = "\t", fileEncoding = "GBK")
保留第一行的变量名,用tab做分隔
1.2.3 读取xlsx数据 (read_xlsx)
需要先安装包:(注意install时要用双引号括起来,调用的时候好像不要求)
- install.packages("readxl")
- library(readxl)
-
data_xlsx = read_xlsx("top250.xlsx", col_name = T)
同样也是用第一行做列名
还可以参考:
[2] R读取txt、csv、xls和xlsx格式文件_华仔的逆袭的博客-CSDN博客_readtable读取xlsx
[3] 方匡南的个人网站-关于R读取文件的几个常错的问题 (kuangnanfang.com)
2 课堂内容
2.1 汇总函数
- class(movie$score):查看数据类型,其中dollar用来选取数据集中的变量
- head():展示数据的前几行,参数 n = 3L代表只查看前三行
- summary():汇总展示每个变量的结果(例如总长度、最大最小值、均值等)
- str():紧凑地显示R对象的内部结构,让用户快速预览对象的内容和结构,比summary()多提供了关于行(观察)和列(变量)的信息以及附加信息,如列的名称、每列的类别以及每列的一些初始观察
- dim():返回数据的维数
2.2 基本数据类型
数值型
例如class(movie$score)将会得到结果[1]"numeric"
又或者可以令 a = 2; class(a) 也会得到[1]"numeric"
字符型
但如果令 a = "2"; class(a) 将得到[1] "character"
因子型
(1) factor定性变量:有若干个水平的取值
- movie¥type = factor(movie¥type):将原来的type类型变为因子型并替代原来那列(这里因为连打两个$会变成公式所以用¥暂代)
此时再class(movie$type)就变成了[1] "factor",这个时候type不是无意义的char,而类似于分组中的标签?我们还可以
- table(movie$type):得到不同type下分别有多少个
因子的设计思想来源于统计学的名义变量,或称为分类变量。 分类变量的值本质上不是数字,而是对应为分类/分组。 因子分为无序因子和有序因子。
因子的类别称为level,结合level,因子在内部被编码为指向level的正整数序号。
(3) 因子型和字符型数据互相转换
- as.factor():将参数强制转换为factor类型
例如上图中我们就可以改写成 x = as.factor(x)
值得注意的是,as.factor()的参数仅为 x ,levels,exclude,ordered,nmax是factor而非as.factor的参数。因此,传递不使用的参数会给运行带来错误。
此外与factor()有关的函数有:
- is.factor():判断数据是否为factor模式,并返回一个逻辑值TRUE或FALSE
- is.ordered():判断数据是否是有序的,并返回一个逻辑值TRUE或FALSE
- as.ordered():按顺序返回参数x
逻辑型
(1) 判断TRUE/FALSE
movie¥type[movie¥name == "霸王别姬"] == "爱情"
(这里同样是用¥代替了$,判断电影名为霸王别姬的电影,类型是否为爱情片)
输出 [1] TRUE
(2) 索引 [ 行索引,列索引]
如挑选 score > 9.5 的电影
- movie$score > 9.5:将得到一堆TRUE/FALSE,正确做法应该是
- movie[movie$score > 9.5, ]:后面的逗号不能忘,否则报错“选择了未定义的列”
- movie[movie$score > 9.5, "nation"]:评分高于9.5的电影来自哪些国家
- movie[movie$score > 9.5, c("nation","type)]:同时筛选两个或多个列
(3) 逻辑语句加减
如 (1 == 2) + (3 < 4) 将输出 [1] 1
2.3 数据结构
向量
(1) 创建
- c()
- c(1,1,12,3)
- c("a", "b", "c")
- seq(0, 10, by = 2):生成0-10之间以2为间隔的等差数列
- 1: 10:生成1-10的连续数列
(2) 索引
- x = c(1,2,2,4,5); x[5]
- which(x == 4):查看 x 向量中4所在的位置
- which.max(x):返回第一个最大值所在的位置
- which.min(x):返回第一个最小值所在的位置
- which(x==max(x)):返回所有最大值所在的位置
(3) 集合运算
- intersect(x, y):求向量的交集
- union(x, y):求向量的并集
- setdiff(x, y):求向量的差集
(4) 数值型向量
- range(x):求范围(最小值,最大值)
- match(x, y):输出x y向量中相同元素的位置
-
cut(x, breaks = , labels = ):将向量 x 按照breaks给出的区间划分/离散化
- sort(x):输出向量x排序后的结果,不改变x原来的排序,逆序decreasing = T
- order(x):输出向量x中每个元素在顺序或逆序排列时对应的位置
- x[order(x)] == sort(x)
(5) 字符串向量
- nchar():提取字符串的长度(英文中的空格也算)
- length():元素的个数
- nchar("明天是晴天")
输出:5 - length("明天是晴天")
输出:1
因为只有一个元素/一个字符串
- substr(“R语言学习笔记”, 1, 3):提取子字符串,输出R语言
- strsplit(x, split = ' '):将字符串按照某种分割形式进行划分,需要设定分隔符
- paste(...., collapse = , sep = " " ):将参数转换为字符串并连接它们
其中,...表示对象,可以有多个,中间用逗号隔开,
sep:表示参数之间的分隔符,默认为空格
collapse:表示如果不指定值,那么函数paste的返回值是...的对象之间通过sep指定的分隔符连接后得到的一个字符型向量;如果为其制定了特定的值,那么自变量连接后的字符型向量会再被连接成一个字符串,之间通过collapse的值分隔
grep():负责搜索给定字符串对象中特定表达式,并返回其位置索引。grepl()函数与之类似,但其后面的”l”则意味着返回的将是逻辑值
chartr(old, new, x):字母替换,要求新旧长度一致
sub(old, new, x):替换第一个出现的字符串
gsub(old, new, x):替换全部old参数
a = 'I love you, do you love me?'
- (chartr = ('you', 'she', a))
输出'I lhve she, dh she lhve me?' - (sub = ('you', 'she', a))
输出'I love she, do you love me?' - (gsub('you', 'she', a))
输出'I love she, do she love me?’
- toupper(x):全部替换为大写
- tolower(x):全部替换为小写
矩阵
(1) 创建
- mat_a = matrix(1:12, nrow = 3, ncol = 4):创建一个3x4的矩阵
1:12沿列填充,可以用bycol = T改为沿行填充 - dig_0 = diag(1 : 4)
- dig_1 = diag(rep(1, 4)):生成一个对角全是1的矩阵
- rep(x, time = , length.out = , each = ,)
- x代表你要进行复制的对象,可以是一个向量也可以是一个因子
- times代表复制的次数,对象是整个向量
- length.out代表最终输出向量的长度
- each代表对向量中的每个元素进行复制的次数
- rep(x, time = , length.out = , each = ,)
(2) 基本的矩阵操作
- dim(mat_a):查看矩阵的维度
输出 3 4 - nrow(mat_a):提取矩阵的行数
输出 3
-ncol(mat_a):提取矩阵的列数
输出 4 - mat_a[1:2, 2:3]:提取12行(1,2行),23列(2,3列)
给行列命名: - colnames(mat_a) : paste("x_", 1:4)
- rownames(mat_a):1:3
调用行列名: - colnames(mat_a)
- rownames(mat_a)
将多个矩阵合并 - rbind(A, B):在A下增加行,要求列数一致
- cbind(A, B):在A右增加列,要求行数一致
(3) 矩阵的数学操作
- A + B:要求A、B大小一样,矩阵元素一一对应相加
- A - B:同上
- A * B:同上,点乘
- A %*% B:矩阵的乘法
- solve(mat_a):求矩阵的逆
- eigen(mat_a):求矩阵的特征值
数组
(1) 创建
-
array(data = NA, dim = length(data), dimnames = NULL)
- data:向量,数组元素
- dim:数组的维度,默认一维
- dimnames:维度的名称,必须是个列表,默认情况下不设置名称
-
result = array(1:18, dim = c(3,3,2), dimnames = list(c("r1","r2","r3"),c("c1","c2","c3"),c("h1","h2")))
- 创建两个不同长度的向量
- vector1 = c(5,9,3)
- vector2 = c(10,11,12,13,14,15)
- result = array(c(vector1, vector2), dim = c(3, 3, 2))将得到两个一样的(3, 3)矩阵
result[1, 2, 2]:获取单个元素
result[1, , ]:获取第一维度的数据
(2) 操作数组元素
- matrix1 = result[, , 1]:获取数组中第1水平的矩阵
- matrix2 = result[, , 2]:获取数组中第2水平的矩阵
- add = matrix1 + matrix2 :矩阵相加
数据框
(1) 创建
读入一个txt,csv等格式的数据,即自成一个数据框
- movie = read.csv("top250.csv", fileEncoding = "gbk", stringsAsFactors = F)
- class(movie):输出"data.frame"
或自己创建
- director <- c("陈凯歌", "宫崎骏", "李廷香","詹姆斯·卡梅隆", "刘镇伟", "周星驰", "李安", "姜文", "张艺谋", "吴宇森","岩井俊二", "王家卫", "陈可辛" )
- birthyear <- c(1952,1941,1964,1954,1952,1962,1954,1963,1950,1946,1963,1958,1962)
- gender <- c("男", "男", "女", "男", "男", "男", "男", "男", "男", "男", "男", "男", "男")
- directors <- data.frame(director, birthyear, gender); head(directors)
不能用数字作为变量开头,如果想用数字开头怎么办呢?
(2) 变形--长宽表互换
需要install.packages("reshape2")
1 宽表变长表
- mLong = melt(mWide, id.vars = c("Name", "Type"), variable.name = "Year")
melt 是溶解/分解的意思, 即拆分数据。
reshape/reshape2 的 melt 函数是个 S3 通用函数,它会根据数据类型(数据框,数组或列表)选择 melt.data.frame, melt.array 或 melt.list 函数进行实际操作。
-
melt(data, id.vars, measure.vars, variable.name = "variable", ..., na.rm = FALSE, value.name = "value")
- data:所选的数据
- id.vars:标识变量,不想改变的数据列
- measure.vars:度量变量,需要melt的数据,通常如果只制定了id.vars剩下的就是measure.vars,反之同理
- variable.name:melt之后,新列变量的取名
- value.name:melt之后,新列变量的对应值的取名
插播一个输出markdown格式的dataframe的方式
- install.packages("knitr")
- library(knitr)
- kable(mWide, format = "markdown")
2 长表变宽表
- dcast(mLong, Name + Type ~Year)
-
dcast(data, formula, fun.aggregate)
- data:所选的数据
- formula:描述了想要的结果,其接受的公式形如:rowvar1 + rowvar2 + ... ~ colvar1 + colvar2 + ...;在这一公式中,rowvar1 + rowvar2 + ...定义了要划掉的变量集合,以确定各行的内容,而colvar1 + colvar2 + ...则定义了要划掉的、确定各列内容的变量集合。简单来说就是:
- ~左边是保持不变的列名
- ~右边是需要扩展的列名
- 省略的(value.name = "value")是需要填充的数据
- fun.aggregate是(可选的)数据整合函数,比如求均值等等
(3) dplyr
列表
(1) 创建
(2) 基本操作
(3) 列表中的**ply函数