R学习笔记1.2

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')
    发现还有报错:

    read.csv
    原因是文档中包含有中文,文件编码不匹配造成的,解决方法有在notepad++中将文件转为utf-8编码,再重新执行语句,或者直接修改csv编码格式为UTF-8。

  • data_csv = read.csv("top250.csv", fileEncoding = 'GBK')
    但是后来发现改成这样也可以,可能是因为:GBK包含全部中文字符;UTF-8则包含全世界所有国家需要用到的字符
    具体可参考:

[1] 网络编码GB2312、GBK与UTF-8的区别 - 百度文库 (baidu.com)

一些函数里的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下分别有多少个

(2) 还可以生成因子型变量,设置因子水平高低
factor

因子的设计思想来源于统计学的名义变量,或称为分类变量。 分类变量的值本质上不是数字,而是对应为分类/分组。 因子分为无序因子和有序因子。

因子的类别称为level,结合level,因子在内部被编码为指向level的正整数序号

factor
无序因子通过factor()创建,可带有level参数设定level取值。 语法是factor(data, levels, labels, ...),其中data是数据,levels是因子水平向量,labels是因子的标签向量。 设定level后不能添加非法level的元素;可以通过levels()修改因子的level。 有序因子通过ordered()创建。
factor

(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给出的区间划分/离散化
    cut
  • 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的值分隔

[4] R语言拼接字符串_paste的用法说明 / 张生荣 (zhangshengrong.com)

  • 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代表对向量中的每个元素进行复制的次数

(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):求矩阵的特征值

数组

来自[5]

[5] R 数组 | 菜鸟教程 (runoob.com)

(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之后,新列变量的对应值的取名

[6] melt()函数的作用是什么? - R语言论坛 - 经管之家(原人大经济论坛) (pinggu.org)

插播一个输出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

[7] R语言 | 数据操作dplyr包_邓旭东HIT的博客-CSDN博客

列表
(1) 创建

(2) 基本操作

(3) 列表中的**ply函数

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容