如何解决将新值添加到通过管道创建的绘图中
请考虑以下数据框,其中有2个人的数据(ID
== a
和b
)。
data <- data.frame(ID = rep(c("a","b"),each = 500),time = 1:500,val = rnorm(1000,mean=1,sd = 0.3))
我们将子集b
的数据作为子集,并使用val
和data_point
绘制dplyr
与ggplot2
的散点图:
library(ggplot2)
library(dplyr)
data%>%
filter(ID == "b")%>%
mutate(data_point = c(1:500))%>%
ggplot(.,)+
geom_point(aes(x=data_point,y=val),size = 0.5)
假设这是时间序列数据,我们感兴趣的是了解不同的移动平均窗口大小如何影响散点图中的最后一个数据点的值(distance
== 500)。假设我们要比较3、5、7和10点移动平均值。我们要获取每个移动平均值的最后一个数据点的值,并将它们添加到散点图中,并用不同的颜色标识该点属于哪个移动平均值。我们如何在管道内(如上图所示)执行此操作,而不必创建新对象来存储移动平均数据点的值?
解决方法
这可以通过管道完成或存储为变量。我将其存储为变量,以便逐步进行操作,如果您想使其保持%>%
界,则交给您。
可复制的数据:
set.seed(42)
data <- data.frame(ID = rep(c("a","b"),each = 500),time = 1:500,val = rnorm(1000,mean=1,sd = 0.3))
head(data)
# ID time val
# 1 a 1 1.4112875
# 2 a 2 0.8305905
# 3 a 3 1.1089385
# 4 a 4 1.1898588
# 5 a 5 1.1212805
# 6 a 6 0.9681626
一组移动平均功能:
funcs <- setNames(
lapply(c(3,5,7,10),function(wid) {
function(x) zoo::rollapplyr(x,wid,mean,fill = NA)
}),paste0("avg",c(3,10)))
data2 <- data %>%
filter(ID == "b") %>%
mutate(data_point = 1:500) %>%
mutate_at(vars(val),funcs)
head(data2)
# ID time val data_point avg3 avg5 avg7 avg10
# 1 b 1 1.3087422 1 NA NA NA NA
# 2 b 2 1.2744325 2 NA NA NA NA
# 3 b 3 0.9992631 3 1.1941459 NA NA NA
# 4 b 4 1.0408029 4 1.1048328 NA NA NA
# 5 b 5 0.7839539 5 0.9413400 1.081439 NA NA
# 6 b 6 0.9405627 6 0.9217732 1.007803 NA NA
tail(data2)
# ID time val data_point avg3 avg5 avg7 avg10
# 495 b 495 1.3165332 495 1.1744507 1.1142967 1.165816 1.263729
# 496 b 496 1.1748916 496 1.2697909 1.1034455 1.151561 1.243861
# 497 b 497 0.7040298 497 1.0651515 1.0804547 1.064344 1.208823
# 498 b 498 1.5053865 498 1.1281027 1.2037578 1.103806 1.154502
# 499 b 499 0.5899477 499 0.9331213 1.0581578 1.071087 1.086029
# 500 b 500 0.8700357 500 0.9884566 0.9688583 1.068396 1.041577
还有一个情节:
# library(tidyr)
ggplot(data2,aes(x = data_point)) +
geom_point(aes(y = val),size = 0.5) +
geom_point(data = ~ tidyr::pivot_longer(tail(.,n=1),starts_with("avg")),aes(y = value,color = name),size = 5)
我将x
美观性移至ggplot
,因为它适用于所有数据,但将y=
保留在每个几何区域内。此方法假定数据已适当排序;如果不采用顺序,则需要调整data=
子集。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。