【问题标题】:Spreading x and y values for plotting from a single column传播 x 和 y 值以从单列绘图
【发布时间】: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 %&gt;% mutate(id = rep(1:3, times = 2)) %&gt;% spread(y1, y2)

标签: r ggplot2 dplyr tidyr


【解决方案1】:
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)  
                    )

# there must be different value of `gr` for each value of `y1`, or you will get `na` in the result  
test$gr <- rep(c("gr1", "gr2", "gr3"), 2)

# then spread `test`
spread(test, y1, y2)
##    gr  V1  V2
## 1 gr1  12  14
## 2 gr2 122 144
## 3 gr3 132 244

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 2012-06-08
    相关资源
    最近更新 更多