Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

数据可视化-基于R语言-第一章-1.4R语言数据处理 #31

Open
zemise opened this issue Aug 1, 2023 · 0 comments
Open

数据可视化-基于R语言-第一章-1.4R语言数据处理 #31

zemise opened this issue Aug 1, 2023 · 0 comments

Comments

@zemise
Copy link
Owner

zemise commented Aug 1, 2023

# 一、数据读取和保存

# 1. 读取外部数据
# 读取含有标题的csv格式数据
table1_1 <- read.csv("data/table1_1.csv")
# 读取不含标题的csv格式数据
table1_1 <- read.csv("data/table1_1.csv", header = FALSE)
# 如果数据已被保存为R格式,可直接用load函数
# 假定table1_1已经是R格式数据
# load("path/table1_1.RData")

# 2. 保存数据
# 将数据保存成csv格式,并存放在指定的路径中
write.csv(table1_1, file = "path/table1_1.csv")
# 将数据保存成R格式
save(table1_1, file = "path/table1_1.RData")

# 二、随机数和数据抽样
# 1. 生成随机数
# 产生10个标准正态分布随机数
rnorm(10)
# 产生10个均值为50,标准差为5的正态分布随机数
rnorm(10,50,5)
# 在0~100之间产生10个均匀分布随机数
runif(10,0,100)
# 产生10个自由度为15的卡方分布随机数
rchisq(10, 15)

# 2. 数据抽样
# 1~20的数据
N <- 1:20
N
# 无放回抽取10个数据
n1 <- sample(N, size = 10)
n1
# 有放回抽取10个数据,有放回就代表能抽到一样的数
n2 <- sample(N, size = 10, replace = TRUE)
n2

# 再比如
Ncols <- c("black", "red", "green", "blue", "yellow")
ncols <- sample(Ncols, size = 8, replace = TRUE)
ncols

# 三、生成频数分布表
# 1. 类别数据频数分布表
# 1.1 一维列联表
# note: 
# - 在这里需要注意下,教材资源给出的数据文件似乎是在Windows上保存的
# - 但是在macOS上,直接读取会报错,简单的处理办法就是打开数据文件,另存为一份
# - 在终端里输入file -I <filename>指令,可以大致判断编码格式
# - 再使用fileEncoding = "编码格式",也有可能解决问题,但我没有成功

# 下方使用了相对路径,如果要设置绝对路径,可以用setpwd("path")
data1_1 <- read.csv("data/data1_1.csv")
# 生成满意度的一维表
myTable1_1 <-table(data1_1$满意度); myTable1_1
# 将myTable1_1 转换为百分比表
prop.table(myTable1_1)*100

# 1.2 二维列联表
# 生成性别和满意度的二维列联表
myTable1_2 <-table(data1_1$性别,data1_1$满意度)
myTable1_2
# 为列联表添加边际和
addmargins(myTable1_2)

# 1.3 多维列联表
# 当有两个以上类别变量时,通常讲一个或多个变量按“列”摆放,其余变量按“行”摆放
# 生成三维列联表(列变量为“满意度”)
myTable1_3 = ftable(data1_1, row.vars = c("性别", "网购次数"), col.vars = "满意度")
myTable1_3

# 也可以将多个变量放在列的位置,其余变量放在行的位置
# 生成三维列联表(列变量为“性别”和“满意度”)
myTable1_4 = ftable(data1_1, row.vars = c("网购次数"), col.vars = c("性别", "满意度"))
myTable1_4

# 使用vcd包中的structable函数可以创建形式多样的多维列联表
install.packages("vcd")
# vcd Loading required package: grid
install.packages("grid")
library(vcd)
# 以默认参数运行
structable(data1_1)
# 上述写法等价于
structable(~性别+网购次数+满意度, data = data1_1)
# 上述写法等价于
structable(data1_1, direction = c("v","h","v"))
# 换个写法则生成不同形式的列联表
structable(性别+网购次数~满意度, data = data1_1)
# 如果想将满意度放在列,其他两个变量放在行,则
structable(data1_1, direction = c("h","h","v"))


# 2. 数值数据类别化
# 生成数值数据的频数分布表,需要先将其类别化,即转化为类别数据,在生成频数分布表
data1_2 <- read.csv("data/data1_2.csv")
# 将销售额转化成向量
v = as.vector(data1_2$销售额)
# 分成间隔为30的组,上限不封闭,列出频数分布表
# R基础包base的cut函数可以将数据分组,breaks是要分的组数;labels是生成组的标签
# right为是否包含上限值;dig.lab设置区间使用的数字位数
d <- table(cut(v, breaks= 30*(17:24), right = FALSE, dig.lab = 4))
# 组织成数据框
dd <-data.frame(d)
# 为频数分布表增加百分比,并重新命名变量
# 计算频数百分比,结果保留2位小数
percent <- round(dd$Freq/sum(dd$Freq)*100, 2)
# 组织成数据框
df <-data.frame(dd, percent)
# 重新命名并组织成频数分布表
mytable<-data.frame(分组=df$Var1, 频数=df$Freq, 频数百分比=df$percent)
mytable

# 使用cut函数生成频数分布表
# 分组间隔为50,并生成频数分布表
d = table(cut(v, breaks = c(500, 550, 600, 650, 700, 750), right = FALSE))
# 组织成数据框
dd = data.frame(d)
# 计算频数百分比,结果保留2位显示
percent = round(dd$Freq/sum(dd$Freq)*100, 2)
# 组织成数据框
df = data.frame(dd, percent)
# 重新命名并整理成频数分布表
mytable = data.frame(分组=df$Var1, 频数=df$Freq, 频数百分比=percent)
mytable

# 更简单的方法,使用DescTools包里的Freq函数分组并生成频数分布表
data1_2 = read.csv("data/data1_2.csv")
install.packages("DescTools")
library(DescTools)
# 使用默认分组,包含上限值
tab = Freq(data1_2$销售额); tab

# 使用Rreq函数生成频数分布表,指定组距 = 20
# 指定组距20,不包含上限
tab1 = Freq(data1_2$销售额, breaks = c(500, 520, 540, 560, 580, 600, 620, 640, 660, 680, 700, 720), right = FALSE)
# 重新命名频数分布表中的变量
tab2 = data.frame(分组=tab1$level, 频数=tab1$freq, 频数百分比=tab1$perc*100, 累计频数= tab1$cumfreq, 累计百分比=tab1$cumperc*100)
# 用print函数定义输出结果的小数位数
print(tab2, digits = 3)

# 四、数据类型的转换
# 1. 将变量转换成向量
table1_1 <- read.csv("data/table1_1.csv")
# 将表中统计学分数转换成向量
vector1 <- as.vector(table1_1$统计学)
# 将表中统计学和数学分数合并转换成一个向量
vector2 <- as.vector(c(table1_1$统计学, table1_1$数学))
vector1; vector2

# 2. 将数据框转换成矩阵
# 将table1_1中的第2列~第4列转换成矩阵mat
mat <- as.matrix(table1_1[, 2:4])
# 矩阵的行名为table1_1第1列的名称
rownames(mat) = table1_1[,1]
mat

# 3. 将列联表转换成数据框
# 如果数据本身就是列联表形式,也就可以将其转换为较原始的数据框形式
# DescTools包中的Untable函数能很容易的完成这种转换
library(DescTools)
# 将列联表转换成数据框
df <- Untable(myTable1_3)
# 显示前3行和后3行
head(df,3);tail(df,3)

# 将列联表转化成带有类别频数的数据框
data1_1 <- read.csv("data/data1_1.csv")
# 生成列联表(也可以使用table函数生成列联表)
tab <- ftable(data1_1)
# 将列联表转换为带有类别频数的数据框
df <- as.data.frame(tab); df
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant