0%

R语言 总结

数据预处理

1. 读入数据

读取 xlsx

1
2
library(openxlsx)
d6.3 = read.xlsx('../Res/mvexer5.xlsx', "E6.3")
1
d10.1 = read.xlsx('mvstat5.xlsx', 'd10.1', rowNames=T)  # rowNames=T 取第一行为 列名

2. 查看数据

2.1 数据维度 dim()

1
dim(d6)

[1] 16 6

16行6列

2.2 查看变量数据类型 class()

1
class(data.frame(c(1,2,3),c(4,5,6)))  # "data.frame"

2.3 转换数据类型

转换为 data.frame

1
2
3
# class(Giris): "matrix" "array"

Giris <- as.data.frame(Giris) # "data.frame"

转换为 数值型,注意:这里 apply()第二个参数是 2 ,即按列

TODO: 不知道为什么,不能按行

1
diris <- apply(diris, 2, function(x)as.numeric(as.character(x))) # 转换为 数值型

转换为数值型后,前方索引为 [1,],而不是 1

转换前:

转换后:

其它常用

1
2
3
head(d)

tail(d)

3. 数据处理

3.1 去重 unique()

1
2
3
# 查重
duplicated(d6.4) # 去重 TRUE 的位置 说明此位置出现重复
d4_uni <- unique(d4) # 去除相同的行

3.2 添加列

读取数据选择 ,利用 cols=c()

data.frame 添加列

1
2
3
d1 = read.xlsx("../Res/mvexer5.xlsx", 'E6.5', cols=c(2,3,4,5))
# 添加 label 列,并赋值为 1
d1$label = 1;d1 # 第一组

matrix 添加列 利用 transform()

1
2
3
4
5
6
7
8
# 为 m1、m2 添加 y 列 并赋值 1、2
m1 <- matrix(c(3, 7, 2, 4, 4, 7), nrow = 3, ncol = 2, byrow = TRUE)
m1 = transform(m1, y = 1)
m2 <- matrix(c(6, 9, 5, 7, 4, 8), nrow = 3, ncol = 2, byrow = TRUE)
m2 = transform(m2, y = 2)

# 行合并
data1 = rbind(m1,m2);data1

3.3 重定义列 colnames()

1
2
3
4
5
6
# 修改 G1, G2, G3 列名为 "x1", "x2", "x3", "x4"
colnames(G1) <- c("x1", "x2", "x3", "x4")
colnames(G2) <- c("x1", "x2", "x3", "x4")
colnames(G3) <- c("x1", "x2", "x3", "x4")
# 按行合并
diris = rbind(G1, G2, G3)

3.4 转换数据类型

1
d3 <- apply(d3, 2, function(x)as.numeric(as.character(x))) # 转换为 数值型

3.5 移除 NA 行

1
2
3
4
5
6
7
8
9
10
11
# 删除 NA 行
# 删除 total_price 列 值 为 NA 的行
df = df[!is.na(df_$total_price),]

# 删除 NA 行,只有有一列值为 NA 即删除
x <- x[!is.na(x)]

# 去掉 price 为 NA 的行
# 注意:但不能用c("price", "A", "B") ,写多列,只有一列一列的检查去 NA
df_data = df_data[!is.na(df_data[, c("price")]),]

is.na() 当值为 NA 或 NaN 时,返回 True

is.nan 当值为 NaN 时,返回 True

3.6 移除指定列名的列

1
2
# 移除 df_uq 的 "product_color", "price" 两列
df_temp = df_uq[, -which(names(df_uq)%in%c("product_color", "price"))]

3.7 将 na值 转为 0

1
2
# 将 na值 转为 0
df_data[is.na(df_data)] <- 0

3.8 将 0值 转为 NA

1
dat[dat==0] = NA

3.9 取出字符串两边空格

1
2
3
4
install.packages("raster")
# 清除字符型数据前后的空格
library("raster")
df_data<-trim(df_data)

3.10 检查是否 有限值

1
sapply(df_tmp,is.finite)

3.11 数据分组以及分组汇总

aggregate函数——分组汇总

1
2
3
4
# Error in aggregate.data.frame(as.data.frame(x), ...) : 'by' must be a list
result1<-aggregate(df_data$product_color, by=df_data[,c("units_sold")], sum)
result2<-aggregate(df_data$product_color, by=df_data[,c("units_sold")], max)
result<-cbind(result1,result2)

3.12 按字符切割字符串

1
2
# 按逗号切割字符串
unlist(strsplit("Summer,Fashion,womenunderwearsuit,printedpajamasset,womencasualshort,Women's Fashion", split = ","))

3.13 修改行名、列名

1
names(df_data) <- c("wei","hei","gen")
1
row.names(df_data)<-c("Mary","Alice","Bob","Judy")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 将第一行作为 列名,第一列作为 行名

read.table()
read.csv()
read.csv2()
read.delim()
read.delim2()

# header=T 表示将文件中的第一行设置为列名。name=1表示将第一列设置为行名称

Data=read.csv("test.csv",row.names=1) #表示第一行是列名,第一列是行名

Data=read.csv("test.csv",header=F) #表示在没有指定列和列名的情况下读入的矩阵数据

# header=T 是默认条件,默认情况下没有行名称,如果第一列是行名称,你需要在输入上指定 row.names=1。
1
2
rownames(df)<-df[,1] # 将数据框的第一列作为行名
df<-df[,-1] # 将数据框的第一列删除,只留下剩余的列作为数据
1
2
rownames(x) <- 
colnames(x) <-

3.14 根据多列、单列数据 新增列

根据多列 新增标签列

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
# price=retail_price 打上标签 diff_price_label = 1
# price<retail_price 打上标签 diff_price_label = 2
# price>retail_price 打上标签 diff_price_label = 3
myFunc.get_diff_price_label<- function (x){
if(x[1]==x[2]) {
return(1)
} else if(x[1]<x[2]) {
return(2)
} else {
return(3)
}
}
# apply: 1: 按行来调用函数,一行一行的数据输入后面的函数调用,指针指向一行,调用一次函数,并将当前行数据作为实参传向函数
# apply: 2: 按列,一列一列的数据输入后面的函数调用
df_data$diff_price_label = apply(df_data[, c("price", "retail_price")], 1, myFunc.get_diff_price_label)

# uses_ad_boosts=1 且 has_urgency_banner=0 打上标签 behavior_label=1
# uses_ad_boosts=0 且 has_urgency_banner=1 打上标签 behavior_label=2
# uses_ad_boosts=1 且 has_urgency_banner=1 打上标签 behavior_label=3
myFunc.get_behavior_label<- function (x){
if(x[1]==1 && x[2]==0) {
return(1)
} else if(x[1]==0 && x[2]==1) {
return(2)
} else {
return(3)
}
}
df_data$behavior_label = apply(df_data[, c("uses_ad_boosts", "has_urgency_banner")], 1, myFunc.get_behavior_label)

df_data

根据单列 新增标签列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 计算平均销量
mean_units_sold = mean(df_data[, c("units_sold")])

# 打上 销量高低标签:1 高销量 0 低销量
myFunc.get_sold_label<- function (x){
if(x[1]>mean_units_sold) {
return(1)
} else {
return(0)
}
}
# 之所以单列使用 sapply,这是因为一列数据是 list vector,而不是 dateset,对于 ventor, list 数据使用 sapply 极其简单且更适合
df_data$sold_label = sapply(df_data[, c("units_sold")], myFunc.get_sold_label)

df_data

PS: 在R语言中,不同于其它语言,索引从 1 开始,维度也从 1 开始,所以 第1维度是行

而在Python中,索引从 0 开始,维度也从 0 开始,所以 第0维度 是 行

绘图

散点图

1
2
3
4
5
6
x1 = c(3,2,4,6,5,4)
x2 = c(7,4,7,9,7,8)
y = c(1,1,1,2,2,2)
(data1 = data.frame(x1,x2,y))
plot(data1[,-3]) # [,-3] 去掉第三列, 绘图: (x1, x2)
text(x1,x2,y,adj=-0.5) # 在点上打上标签: y

tidyverse

tidyverse是一组处理与可视化R包的集合,其中ggplot2dplyr最广为人知。

核心包有以下一些:

  • ggplot2 - 可视化数据
  • dplyr - 数据操作语法,可以用它解决大部分数据处理问题
  • tidyr - 清理数据
  • readr - 读入表格数据
  • purrr - 提供一个完整一致的工具集增强R的函数编程
  • tibble - 新一代数据框
  • stringr - 提供函数集用来处理字符数据
  • forcats - 提供有用工具用来处理因子问题
1
2
install.packages("tidyverse")
library(tidyverse)

分组汇总

属于 dplyr 包,已被包含于 tidyverse

1
2
3
4
5
6
# 按 product_color 分组
# 对 units_sold 组内求和,新列名 sum_units_sold
# 组内计数 items_count
df_product_color <- df_data %>%
group_by(product_color) %>%
summarise(sum_units_sold = sum(units_sold), items_count = n())

n() :无需参数返回当前分组的大小

PS: 出现报错,只是警告,无需在意

summarise() ungrouping output (override with .groups argument)

参考:分组汇总时提示:summarise() ungrouping output....解决方法

排序

1
2
3
4
5
6
7
8
9
10
11
# 按照进行 sum_units_sold 进行降序排序
df_product_color = arrange(df_product_color, desc(df_product_color$sum_units_sold))

# 经过处理后,不再是简单的 data.frame,而是加强版,为了之后用原方法处理,所以强转
df_product_color = as.data.frame(df_product_color)

# 删除 product_color 为空字符串 的行
# 注意:[df_product_color["product_color"]!='',] 中逗号“,” 必须保留,这样筛选后依然是data.frame
df_product_color_new = df_product_color[df_product_color["product_color"]!='',]

df_product_color_new

Q&A

补充

R语言中的 "因子" 变量类型 factor()

1
2
3
4
5
6
7
8
9
10
11
12
x <- c("10", "20", "30", "50")

# 10 20 30 50
as.numeric(x)

y <- as.factor(x)
# [1] 10 20 30 50
# Levels: 10 20 30 50
y

# [1] 1 2 3 5
as.numeric(y)

因子(factor)转换成数值型(numeric)规则:

一共有n个数,那么转换后的数字就会在 1-n 中取值,数字最小的取1,次小的取2,以此类推

Q:那么如果让因子(factor)类型里的数值转换对应的数值型?

A:

  1. as.numeric(as.character(factorName))
  2. as.numeric(levels(factorName)[factorName])

设置国内镜像源

1
2
3
options(repos=structure(c(CRAN="http://mirrors.aliyun.com/CRAN/")))

options(repos=structure(c(CRAN="https://mirrors.tuna.tsinghua.edu.cn/CRAN/")))

参考

感谢帮助!