【发布时间】:2018-02-03 00:32:04
【问题描述】:
我有一个关于传播 x 和 y 值以从单列绘图的问题。我尝试从 y2 创建 x 和 y 值,并使用 tidyr spread 函数来执行此操作。
test = data.frame(gr =rep(c("Gr1","Gr2"),each=3),
y1=rep(c("V1","V2"),each=3),
y2=c(12,122,132,14,144,244)
)
> test
gr y1 y2
1 Gr1 V1 12
2 Gr1 V1 122
3 Gr1 V1 132
4 Gr2 V2 14
5 Gr2 V2 144
6 Gr2 V2 244
想要从 y2 创建 x 和 y 轴值
library(dplyr)
library(tidyr)
test2 <- test%>%
mutate(No=1:n())%>%
spread(y1,y2) #sorry there is no group by here
如果我不添加 mutate(No=1:n()) 行,它会给出
错误:行 (1, 2, 3), (4, 5, 6) 的标识符重复
反正输出是
# A tibble: 6 x 4
# Groups: gr [2]
gr No V1 V2
* <fctr> <int> <dbl> <dbl>
1 Gr1 1 12 NA
2 Gr1 2 122 NA
3 Gr1 3 132 NA
4 Gr2 4 NA 14
5 Gr2 5 NA 144
6 Gr2 6 NA 244
library(ggplot2)
ggplot(data = test2 , aes(y = V2, x = V1)) +
geom_point(size=2,alpha=0.5,shape=21,aes(fill=gr))+
theme_bw()
这会创建一个空图,因为 V2 没有对应的 V1 值。
如果我使用na.omit(),它会删除整行。
每当我需要使用spread 函数时,我总会遇到这个问题。有时我会创建两个不同的数据集而不是将它们组合起来。但我正在寻找更优雅的解决方案。
预期输出
谢谢。
**在@joran 评论后编辑
test = data.frame(gr =rep(c("Gr1","Gr1"),each=3),
y1=rep(c("V1","V2"),each=3),
y2=c(12,122,132,14,144,244)
)
library(dplyr)
library(tidyr)
test2 <- test%>%
mutate(No=seq(1,6))%>%
spread(y1,y2)
> test2
gr No V1 V2
1 Gr1 1 12 NA
2 Gr1 2 122 NA
3 Gr1 3 132 NA
4 Gr1 4 NA 14
5 Gr1 5 NA 144
6 Gr1 6 NA 244
预期输出
> test2
gr No V1 V2
1 Gr1 1 12 14
2 Gr1 2 122 144
3 Gr1 3 132 244
【问题讨论】:
-
(1) 您的数据中有什么明确地将 x 值 12 与 y 值 14 联系起来?没有。您需要按组重复序列。 (2) 你必须放弃 gr 变量。想想看,如果 12 和 14 是位于同一行的 x/y 对,那么该行是 Gr1 还是 Gr2?您不能将两者都放在同一个变量中。
-
@joran %100 同意你的看法。然而,即使你制作了 Gr1 重复序列,我仍然得到 NA 值。有东西不见了!
-
你是对的!缺少的是我的观点 (1)。
-
你误解了我的意思(1)。您需要一个执行“1 2 3 1 2 3”的列。这就是我所说的“重复列”。
-
test %>% mutate(id = rep(1:3, times = 2)) %>% spread(y1, y2)