首页 理论教育 数据处理要点总结-基于ggplot的政经数据可视化

数据处理要点总结-基于ggplot的政经数据可视化

时间:2023-11-19 理论教育 版权反馈
【摘要】:由于ggplot系统只接受特定形式的数据,我们现在需要重构这个数据框,并要求,新的数据框的第1列仍然是月份,第2列是支出类别,第3列是具体的数值。librarydat=read.csv # 课件中的文件# melt的第1个参数是待处理的数据框。measure.vars则是所有记录具体数值的列long=melt# dcast的功能刚好相反:假如我们手中的数据是上边的long数据框,但却需要把它变成食品支出占一列,交通支出占一列的形式,就需要用dcast。value.var用于指定存放具体数值的那一列。

数据处理要点总结-基于ggplot的政经数据可视化

读者学习可视化之前理解并掌握以下代码。

# install.packages(c("truncnorm", "plothelper", "reshape2"))

## 生成呈正态分布且在特定范围内即截断正态分布随机数需使用truncnorm包

library(truncnorm)

set.seed(1); x=rtruncnorm(30, a=0, b=Inf, mean=0.1, sd=3) # 用a和b指定数值范围由于指定最小值为0所以结果不包含小于0的数值

## 将各项等长的列表转化成矩阵

L=list(1: 5, 11: 15, 21: 25)

do.call(rbind, L)

do.call(cbind, L) # list2DF(L)可生成数据框

## 将列表中的矩阵或数据框进行合并

m1=data.frame(x=1: 5, y=6: 10)

m2=matrix(21: 28, ncol=2)

colnames(m2)=c("x", "y") # 当把一个数据框跟其他数据框或矩阵合并时应确保二者有相同的列标题

L=list(m1, m2)

do.call(rbind, L)

## 将矩阵或数据框转化成列表

m=matrix(1: 12, nrow=3)

asplit(m, 1) # 按行转化

asplit(m, 2) # 按列转化

dat=data.frame(m, character=letters[1: 3]) # 注意当各列的类型不同时的结果

asplit(dat, 2)

## 获得所有可能组合并组成数据框

y=expand.grid(1: 3, 1: 5) # 注意列标题

y=expand.grid(m=1: 3, n=c("a", "b"), strings As Factors=FALSE)

## 交叉表matrix对象或table对象转化成数据框

mat=matrix(c(20, 50, 0, 100, 0, 7), nrow=3, dimnames=list(c("r1","r2", "r3"), c("c1", "c2")))

dat=as.data.frame(as.table(mat)) # 如果mat已经是table对象则直接使用as.data.frame

dat2=dat[dat$Freq != 0, ] # 有时需要去掉有0值的行

## 数据框转化成交叉表

dat=expand.grid(subject=letters[1: 4], object=letters[24: 26])

dat=data.frame(dat, freq=101: 112)

dat=dat[-10, ] # 假设第10行所代表的组合不存在

tapply(dat$freq, INDEX=list(dat$subject, dat$object), FUN=

function(x) x) # 不存在的组合的频数以NA表示

## tibble包生成的数据框

# ggplot系统既可使用data.frame数据框又可使用由tibble包生成的数据框后者在各列的对象类型等方面提供了更多灵活性

library(tibble)

x1=1: 3

x2="abc"

x3=list(e1=1: 5, e2=letters[1: 4], e3=matrix(1: 10)) # 第3列是一个列表(www.xing528.com)

x4=list(matrix(1: 8)) # 第4列是一个重复单一值的列表

dat=tibble(x1, x2, x3, x4)

class(dat) # "tbl_df" "tbl" "data.frame"

## 数据框合并

# 以下两个数据框记录了若干国家的两个随机生成的指标值我们需要把它们整合成一个表格要注意的问题是第一两个数据框中国家的排列顺序不一样;第二有的国家只出现在一个数据框中第三有的指标包含缺失值不过以上问题并不影响我们用merge函数进行合并

dat1=read.csv("index1.csv"); dat2=read.csv("index2.csv") # 课件中的文件

res=merge(dat1, dat2, by="country", all.x=TRUE, all.y=TRUE) # by为合并所依据的变量在本例中就是国家名all.x和all.y表示是否要求最终结果包含那些只出现在了一个数据框中的个案

## 数据框变形

# 本例使用的随机生成数据wide1.csv包含3列第1列是月份第2列是受访者各月食品支出第3列是各月交通支出由于ggplot系统只接受特定形式的数据,我们现在需要重构这个数据框并要求新的数据框的第1列仍然是月份第2列是支出类别第3列是具体的数值我们用reshape2包中的melt完成这个操作

library(reshape2)

dat=read.csv("wide1.csv", row.names=1) # 课件中的文件

# melt的第1个参数是待处理的数据框id.vars相当于为采样所作的编号本例中的数据是按月采样的所以数据中的"month"一列记录的就是这个编号假如数据框本身不包含这样的列可手动用1: nrow(dat)生成一列measure.vars则是所有记录具体数值的列

long=melt(data=dat, id.vars="month", measure.vars=c("food","transportation"))

# dcast的功能刚好相反假如我们手中的数据是上边的long数据框但却需要把它变成食品支出占一列交通支出占一列的形式就需要用dcastvalue.var用于指定存放具体数值的那一列formula参数赋值时不要加引号的设置方法是波浪线左边是采样编号在本例中就是"month"一列波浪线右边是数值的类别,在本例中就是"variable"一项

wide=dcast(data=long, formula=month~variable, value.var="value")

# 当数据包含两个采样编号时我们仍可使用melt和dcast数据wide2.csv用"subject"一列注明了数据来自哪个受访者因此这个数据的采样编号来自"month"和"subject"这两列

dat=read.csv("wide2.csv", row.names=1) # 课件中的文件

long=melt(data=dat, id.vars=c("month", "subject"), measure. vars=c("food", "transportation"))

wide=dcast(data=long, formula=month+subject~variable, value. var="value")

## 显示大数值

x=c(1234567, 123456, 123)

format(x, big.mark=", ")

# [1] "1, 234, 567" " 123, 456" " 123"

## 自动换行对于单词中间有空格的文字每当字符达到一定数量时自动插入换行符对字间无空格的中文无效

library(scales)

f=wrap_format(width=15) # 这个函数生成的结果是另一个函数width参数用来指定每行的长度

mytext="You must use more lines to display a very long label."

f(mytext)

# [1] "You must use\nmore lines to\ndisplay a very\nlong label."

## 将整数变为序数字符

library(scales)

scales::ordinal(1: 30)

# [1] "1st" "2nd" "3rd" "4th" ...

## 保留特定位数的小数并把结果转化为字符

library(plothelper)

x=c(12, 12.3, 12.34, 12.345, 12.3456)

round_text(x, 2)

# [1] "12.00" "12.30" "12.34" "12.35" "12.35"

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈