还没决定

R-base

数据分析常用操作的笔记,R语言版本。

数据操作:使用dplyr包(plyr包)、data.table包

数据整合:使用reshape2包、tidyr包

以下为原生R语言的数据处理(不涉及第三方R包)。

读取数据

1
2
# 读取文件数据后形成数据框对象
> df <- read.csv('adultTest.csv')

数据探索

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# 当前工作区间的对象列表
> ls()
[1] "df" "slice01" "slice02"
# 删除指定对象
> rm(df)
# 删除当前工作环境中所有对象
> rm(list=ls())
# 编辑对象
> fix(df)
# 编辑对象并另存为newobjext
> newdf <- edit(df)
# 数据框大小,对象的维度
> dim(df)
[1] 32561 15
# 显示某对象的结构
> str(df)
# 对象类型,相当于py的type()
> class(df)
[1] "data.frame"
# 对象模式
> mode(df)
[1] "list"
# 显示对象中各成分的名称,相当于py的columns
> names(df)
[1] "age" "workclass" "fnlwgt" "education" "education.num" "marital.status"
[7] "occupation" "relationship" "race" "sex"
# 特征数量
> length(df)
[1] 15
# 特征数量单独计数
> lengths(df)
age workclass fnlwgt education education.num
32561 32561 32561 32561 32561
# 对象的头尾记录
> head(df)
> tail(df)
# 数据描述
> summary(df)
ID Treatment Sex Age Improved
Min. : 1.00 Placebo:43 Female:59 Min. :23.00 None :42
1st Qu.:21.75 Treated:41 Male :25 1st Qu.:46.00 Some :14
Median :42.50 Median :57.00 Marked:28
Mean :42.50 Mean :53.36
3rd Qu.:63.25 3rd Qu.:63.00
Max. :84.00

数据清洗

类型转换

判断 转化
is.numeric(df%A) as.numeric()
is.charachter() as.charachter()
is.vector() as.vector()
is.matrix() as.matrix()
is.data.frame() as.data.frame()
is.factor() as.factor()
is.logical() as.logical()

缺失值

注意:R中NA为缺失值,与NAN是不同的,而Inf和-Inf是正负无穷

1
2
3
4
5
6
7
8
9
10
# 缺失值判断,返回布尔向量/矩阵
> y <- c(1,2,3,NA)
> is.na(y)
[1] FALSE FALSE FALSE TRUE
# 在分析中排斥缺失值
> sum(y, na.rm = TRUE)
# 缺失值排除,任意一行有NA就整列丢弃
> na.omit(df)

日期格式

修改表结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 创建新变量new(以旧的特征A和B)
> df$new <- df$A + df$B
> df <- transform(df,
new1 = A + B,
new2 = (A+B)/2)
# 连续型变量转化分类变量
# 麻烦方法一
> df$agecat[df$age > 75] <- "Elder"
> df$agecat[df$age >= 55 & df$age <75=] <- "Middle"
> df$agecat[df$age < 55] <- "Young"
# 方法二 within()与with()类似,但允许修改数据框
> df <- within(df,{agecat <- NA
agecat[age>75] <- "Elder"
agecat[age>=55 & age<=75] <- "Middle"
agecat[age<55] <- "Young"})
# 字符串切分创建新变量
> name <- strsplit((df$name)," ")
# 等价于 unlist(name)[2],不是从0开始
> Lastname <- sapply(name,"[",2)
> Firstname <- sapply(name,"[",1)
# 修改特征名(列名)
# 方法一
> fix(df)
# 方法二
> names(df)[2] <- "newcname"
> names(df)[6:7] <- c("name1","name2")
# 方法三:plyr包
> library(plyr)
> df <- rename(df, c(oldname1="newname1",
oldname2="newname2"))
# 排序order()
# 创建一个新数据集,依A特征升序排序
> newdf <- df[order(df$A),]
# 依A特征升序,A相同的再依B特征升序
> newdf <- df[order(df$A, df$B),]
# 加上符号-就是降序
> newdf <- df[order(df$A, -df$B),]

数据切片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 基本切片
> newdf <- df[,c(6:10)]
> myvars <- c("A","B","C","D")
> newdf <- df[myvars]
# 剔除(丢弃)变量
> myvars <- names(df) %in% c("A","B")
> newdf <- df[!myvars]
> newdf <- df[c(-8,-9)] # 负号万能
# 选取1到3行
> df[1:3,]
# 特征条件选取
> df[df$A=="M" & df$age>30]
# subet()
# 用条件筛选完行后,再筛选列
> df <- subset(df,
age>=25 & gender=="M",
select=c("A","B","C"))

表格整合

1
2
3
4
5
6
7
8
9
# 内联结 inner join
> total <- merge(df1,df2,by="ID"])
> total <- merge(df1,df2,by=c["ID","Country"])
# 上下拼接,要确保df1和df2有相同的特征(列),并且顺序一致
> total <- cbind(df1,df2)
# 左右拼接,待试验
> total <- rbind(df1,df2)

数据聚合&分组运算

使用reshape2包

1
2
3
> library(reshape2)
> melt()
> dcast()

数据透视表

1
2
# 频数列联表,相当于pd.crosstab()
> table(df$A)

数据导出

R数据处理函数

  • 数学函数
  • 统计函数
  • 概率函数
  • 字符串处理函数
  • 其他