R语言实战第3章 基本数据管理

第3章 基本数据管理

3.1 一个示例

image.png

使用代码创建一个名为leadership的数据框存储上述表格

leadership <- data.frame(
  manager <- c(1, 2, 3, 4, 5),
  date <- c("10/24/08", "10/28/08", "10/1/08", "10/12/08", "5/1/09"),
  country <- c("US", "US", "UK", "UK", "UK"),
  gender <- c("M", "F", "F", "M", "F"),
  age <- c(32, 45, 25, 39, 99),
  q1 <- c(5, 3, 3, 3, 2),
  q2 <- c(4, 5, 5, 3, 2),
  q3 <- c(5, 2, 5, 4, 1),
  q4 <- c(5, 5, 5, NA, 2),
  q5 <- c(5, 5, 2, NA, 1)
)

3.2 创建新变量

公式:

变量名 <- 表达式 (“表达式”部分可以包含多种运算符和函数)
image.png

现有leadership数据框,想创建新变量total_score和mean_score:

方法一:
leadership$total_score <- leadership$q1 + leadership$q2 + leadership$q3 + leadership$q4 + leadership$q5
leadership$mean_score <- (leadership$q1 + leadership$q2 + leadership$q3 + leadership$q4 + leadership$q5)/5
方法二:推荐
leadership <- transform(leadership, 
                                      total_score = q1+ q2 + q3 + q4 + q5,
                                      mean_score = ( q1+ q2 + q3 + q4 + q5)/5)

3.3 变量的重编码

重编码涉及根据同一变量和或其他变量的现有值创建新值的过程。举例来说,你可能想:

  • 将一个连续型变量修改为一组类别值;
  • 将误编码的值替换为正确值;
  • 基于一组分数线创建一个表示及格/不及格的变量。

要重编码数据,可以使用R中的一个或多个逻辑运算符(见表)。


image.png

将leadership数据集中经理人的连续型年龄变量age重编码为类别型变量agecat(Young、 Middle Aged、Elder)。首先,必须将99岁的年龄值重编码为缺失值(因为不可能有人99岁了还当经理,我们默认99是缺失值),使用的代码为:

leadership$age[leadership$age == 99] <- NA
#然后用以下代码创建新变量agecat为age的类别型变量
leadership$agecat[leadership$age > 75] <- "Elder"
leadership$agecat[leadership$age >= 55 & leadership$age <= 75] <- "Middle Aged"
leadership$agecat[leadership$age < 55 ] <- "Young"
#这个代码看起来很臃肿,可以用函数within()它和with()
leadership <- within(leadership,{
                     agecat <- NA
                     agecat[age>75] <- 'Elder'
                     agecat[age>=55 & age<=75] <- 'Middle Aged'
                     agecat[age<55] <- 'Young' })
#此时agecat只是字符型变量,我们需要转换成有序型因子:
leadership$agecat <- factor(leadership$agecat,
                            levels = c('Young','Middle Aged','Elder'),
                            ordered = TRUE)

3.4 变量的重命名

方法一:使用语句调用交互式编辑器

fix(leadership)

方法二:names函数

names(leadership)[2] <- "testDate"
names(leadership)[6:10] <- c("item1","item2","item3","item4","item5")

3.5 缺失值

在R中,缺失值以符号NA表示。
\color{#A52A2A}{is.na()}检测缺失值是否存在。

is.na(leadership[,6:10])  # 取数据框的6~10列
##         q1    q2    q3    q4    q5
## [1,] FALSE FALSE FALSE FALSE FALSE
## [2,] FALSE FALSE FALSE FALSE FALSE
## [3,] FALSE FALSE FALSE FALSE FALSE
## [4,] FALSE FALSE FALSE  TRUE  TRUE
## [5,] FALSE FALSE FALSE FALSE FALSE

# []中加',' 前是行,后是列
is.na(leadership[1,6:10])  #取数据框第1行的6~10列
##         q1    q2    q3    q4    q5
## [1,] FALSE FALSE FALSE FALSE FALSE

注意:

  • 缺失值被认为是不可比较的。
  • R并不会把无限的或者不可能出现的标记为缺失值。正无穷和负无穷分别为Inf和-Inf,不可能的值用NaN表示。识别分别用is.infinite()或is.nan()

3.5.1 重编码某些值为缺失值

leadership$age[leadership$age == 99] <- NA

3.5.2 在分析中排除缺失值

含有缺失值的算术表达式和函数计算结果也是缺失值,因此需要数据分析前删除缺失值。
多数的数值函数都有 \color{#A52A2A}{na.rm = TRUE}选项,可以在计算前移除缺失值并使用剩余值计算。

x = c(1,2,NA,4)
sum(x, na.rm = TRUE)

使用函数处理不完整的数据时,查下帮助文档,看看这些函数时如何处理缺失数据的。
\color{#A52A2A}{na.omit()} 可删除所有含有缺失值数据的行。

newdata <- na.omit(leadership)
##   ManageID   testData country gender age q1 q2 q3 q4 q5      agecut
##  managerID testDate country gender age item1 item2 item3 item4 item5 total_score mean_score age
##  1         1 10/24/08      US      M  32     5     4     5     5     5          24        4.8  32
##  2         2 10/28/08      US      F  45     3     5     2     5     5          20        4.0  45
##  3         3  10/1/08      UK      F  25     3     5     5     5     2          20        4.0  25

3.6 日期值

日期值通常以字符串的形式输入到R中,然后转化为以数值形式存储的日期变量。输出默认格式:yyyy-mm-dd 语法:\color{#A52A2A}{as.Data(x, "input_format")}

符号 含义 示例
%d 数字表示的日期(0~31) 01~31
%a 缩写的星期名 Mon
%A 非缩写星期名 Monday
%m 月份(00~12) 00~12
%b 缩写的月份 Jan
%B 非缩写月份 January
%y 两位数的年份 07
%Y 四位数的年份 2007
mydates <- as.Date(c("2007-06-22","2004-02-13")) --日期值默认输入格式为‘yyyy-mm-dd’
strDates <- c("01/05/1965","08/16/1975")
dates <- as.Date(strDates, "%m/%d/%Y") --使用mm/dd/yyyy格式读取
myformat <- "%m/%d/%y" --leadership数据框中,日期以mm/dd/yy格式编码为字符型变量
leadership$date <- as.Date(leadership$date, myformat)
Sys.Date()  返回当前日期
[1] "2024-09-02"
Sys.time() 返回当前日期+时间
[1] "2024-09-02 20:37:16 CST"
date() 返回当前日期+时间
[1] "Mon Sep  2 20:37:24 2024"

\color{#A52A2A}{format(x, format = "output_format")}输出指定格式的日期值或提取日期值的某些部分

today = Sys.Date()
format(today, format = "%d/%m/%y")
## "02/09/24"
format(today, format = "%A")
## "星期二"

日期值可以执行算数运算,diiftime()可以计算时间间隔,并以星期、天、时、分、秒表示

today = Sys.Date()
my_birth <- as.Date("1990-01-11")
days <- today - my_birth
days
输出:Time difference of 12653 days
difftime(today, my_birth, units = "weeks")
输出:Time difference of 1807.571 weeks

\color{#A52A2A}{as.character()}可将日期值转换为字符型

as.character(my_birth)
[1] "1990-01-11"

3.7 类型转换

类型转换函数

判断 转换
is.numeric() as.numeric()
is.character() as.character()
is.vector() as.vector()
is.matrix() as.matrix()
is.data.frame() as.data.frame()
is.factor() as.factor()
is.logical() as.logical()

3.8 数据排序

\color{#A52A2A}{order()}默认升序,在排序变量的前边加一个减号即可得到降序的排序结果。
\color{#A52A2A}{疑问???下面语法加逗号和不加逗号的区别??????}
答:加逗号,按行排序,不加逗号,默认按列排序。

规则:将隔行按女性到男性、同样性别中按年龄升序排序
newdata <- leadership[order(leadership$gender,leadership$age),] 
规则:将隔行按女性到男性、同样性别中按年龄降序排序
newdata <- leadership[order(leadership$gender, -leadership$age),]

3.9 数据集的合并

在数据框中添加列,\color{#A52A2A}{merge()}横向合并通过一个或多个共有变量联结:

total = merge(dataframeA, dataframeB, by = "ID")
total = merge(dataframeA, dataframeB, by = c("ID","Country"))

\color{#A52A2A}{cbind()} 横向合并,保证其正常工作需:每个对象必须拥有相同的行数、以同顺序排序。
\color{#A52A2A}{rbind()} 纵向合并,两个数据框必须有相同变量,不过顺序不一定相同.

total = rbind(dataframeA, dataframeB)

3.10 切分数据集

选取变量

newdata=newdata2保留q1-q5列

myvars <- paste("q",1:5)
newdata <- leadership[myvars]
newdata2 <- leadership[,myvars]

剔除变量

方法一:

myvar <- names(leadership) %in% c("q1","q2")
newdata <- leadership[!myvar]
newdata

方法二:只要要删哪一行,直接给出来即可

newdata <- leadership[c(-6,-7)]

方法三:知道要删哪个变量,直接赋值NULL,注意:NULL与NA不同。

leadership$q1 <- leadership$q2 <- NULL

选入观测值

举例:选出30岁以上的男性

select1 <- leadership[leadership$gender == 'M' & leadership$age > 30,]

研究范围限定在在2009年1月1日到2009年12月31日之间收集的观测上

leadership$date <- as.Date(leadership$date,"%m/%d/%y")
min <- as.Date("2009-01-01")
max <- as.Date("2009-12-31")
newdata <- leadership[which(leadership$date >= min & leadership$date < = max),]

subset()函数

非常简单的选择变量和观测的方法

newdata <- subset(leadership, age>=35 | age<23, select = c(q1,q2,q3,q4))
选择年龄在35以上或23以下的所有观测值,并保留变量q1到q4
newdata <- subset(leadership, gender == "M" & age >25, select = gender:q4)
选择年龄在25以上的男性,并保留变量gender到q4

随机抽样

从leadership数据库中随机抽取大小为3的样本
在数据挖掘和机器学习中常用。如你可能希望选择两份随机样本,一份用于构建预测模型,另一份用于验证模型的有效性。

mysample<- leadership[sample(1:nrow(leadership), 3, replace = FALSE),]

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