ggplot2-数据变换2

缺失值

NA在R中用来表示缺失值,缺失值永远不会自己消失
关于缺失值,最需要明白的是,它们是会传染的:除了极少数例外情况,一个包含缺失值的操作结果也将是一个缺失值。这是因为NA代表一个未知的值,几乎没有什么操作可以把它变为已知

x <- c(1, NA, 2)
x == 1
#> [1] TRUE NA FALSE
x > 2
#> [1] FALSE NA FALSE
x + 10
#> 11 NA 12

如果刚刚开始学习R,可能会尝试用==找缺失值

x == NA
#> [1] NA NA NA
x != NA
#> [1] NA NA NA

但是却不管用,因为没有理由证明两个未知值是一样的,因此,需要用is.na(X)来判断一个值是否为缺失值

is.na(x)
#> [1] FALSE FALSE FALSE

filter()仅包括那些所有逻辑值都为TRUE的观测,所以NA都被自动删除了。如果希望包括那些缺失值,需要具体的指定 x > 10 | is.na(x)。有时需要将缺失值都转换为FALSE,可以通过x > 10 & !is.na(x)实现

建立新变量

为了更好地探索x和y的关系,“旋转”以下这个图可能有用:让数据散点图变成平的而非现在的对角线。通过建立两个新的变量达到这个目的:一个表示x和y的差值(在这个例子中代表了钻石的对称性),另一个表示它的大小(对角线的长度)

mutate()函数可以建立新的变量。和filter()函数相同,它也将数据框作为第一个参数并返回调整后的数据框。之后的参数则是生成新变量的表达式和变量名。和filter()一样,可以直接指定变量名而无需再重复输入数据框名

diamonds_ok2 <- mutate(diamonds_ok, sym = x - y, size = sqrt(x ^ 2 + y ^ 2))
diamonds_ok2
ggplot(diamonds_ok2, aes(size, sym)) + stat_bin2d()

在这里插入图片描述

该图有两个好处:更清楚地展示了大多数钻石的情况,更容易从中选出异常值。在这里异常值的正(x比y大)负(y比x大)应该并不重要,所以可以取这个对称变量的绝对值,然后筛选这些异常值。基于此图并做了一些尝试后,取0.20作为临界值并通过直方图对结果进行检查

ggplot(diamonds_ok, aes(abs(sym))) + geom_histogram(binwidth = 0.10)
diamonds_ok3 <- filter(diamonds_ok2, abs(sym) < 0.20)
ggplot(diamonds_ok3, aes(abs(sym))) + geom_histogram(binwidth = 0.01)

在这里插入图片描述

这个直方图很有意思!尽管大多数钻石都接近对称,但只有极少数是真正完全对称的(也就是 x == y)

有用的工具

  • 对数变换。它可以将变量间的乘法关系转换为加法关系:可以压缩变量在量纲上的区别:可以将指数关系转换为线性关系
  • 相对差异。如果关注两个变量的相对差异,用log(x / y)比用 x / y更好,因为它是对称的:如果 x < y,x / y取值为[0, 1),而如果x > y,x / y取值为(1, Inf)
  • 积分或差分。如果数据中包含距离和实践,速度或加速度是否会更有用?(或相反)(积分会使数据更平滑,差分则会使之不平滑)
  • 将一个数字分为数值和方向。利用abs(x)和sign(x)可以做到

还有一些针对多个变量的常用变换方法

  • 如上所述,积分和差分是有效的
  • 如果可以看到一个明显的趋势,可以利用模型将其分为趋势项和残差项
  • 有时可以将未知坐标转换为极坐标(或反过来):距离(sqrt(x ^ 2 + y ^ 2))和角度(atan2(y, x))

分组汇总

很多有启发性的可视化需要将完整的数据集简化为一个有意义的汇总。ggplot2提供了许多几何对象可以完成这个工作。但通常手动做汇总更有必要:可以更灵活地完成这个工作,并且可以方便地将汇总用于其它目的

dplyr分两步完成汇总

  1. group_by()函数定义分组函数
  2. 用一行summarise()代码描述如何对每组汇总
    举个例子,要想看不同净度的钻石的平均价格,首先将数据按净度分组,然后进行汇总
by_clarity <- group_by(diamonds, clarity)
sum_clarity <- summarise(by_clarity, price = mean(price))
sum_clarity

ggplot(sum_clarity, aes(clarity, price)) +
	geom_line(aes(group = 1), color = "grey80") +
	geom_point(size = 2)

在这里插入图片描述

可能会觉得这个结论很费解:为什么钻石的净度更高时价格却变低了?将会在之后的移除趋势中给出此问题的解释和解决方法

如果要利用多个变量来分组,则将额外的变量加到group_by()中。接下来的例子就展现了如何(手动)计算一个展现切工和深度关系的频率多边形。汇总函数中n()的作用是数出每组内观测的个数

cut_depth <- summarise(group_by(diamonds, cut, depth), n = n())
cut_depth <- filter(cut_depth, depth > 55, depth < 70)
cut_depth
ggplot(cut_depth, aes(depth, n, color = cut)) +
	geom_line()

在这里插入图片描述

用分组的mutate()函数将计数转换为比例,这样更方便在各个切工中作比较。summarise()函数去掉了分组的一个水平,因此cut_depth将依切工分组

cut_depth <- mutate(cut_depth, prop = n / sum(n))
ggplot(cut_depth, aes(depth, prop, color = cut)) +
	geom_line()

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值