我可以在r中绘制子集的值吗?

时间:2018-10-19 00:20:19

标签: r ggplot2 subset

我有一个神经认知研究的数据。我们通过三项略有不同的调查来衡量结果,参与者获得的可能分数范围相同。我的数据格式很长,也就是说,每个参与者都有三行,分别是变量pointsoutcome。变量outcome表示在给定行(scd_gbscd_rbscd_ab)中用于测量点的调查类型。

    id outcome points
    1  scd_gb   20
    1  scd_rb   15
    1  scd_ab   3
    2  scd_gb   6
    2  scd_rb   18
    2  scd_ab   15

我想创建一个散点图,其中我在x轴上有scd_gbscd_gbscd_rb在y轴上,每个都有不同的颜色。

所以我有两个问题: 首先,我可以相互绘制子集还是可以将数据转换为宽格式? 其次(通常),我可以将一个变量与另外两个变量作图吗?

我尝试了以下返回错误的代码。

    library(ggplot2)
    ggplot(SCD_long , aes(x = points(subset(SCD_long, outcome %in% c("scd_gb"))), 
    y = points(subset(SCD_long, outcome %in% c("scd_rb" , "scd_ab"))))) +
        geom_point(aes(color = outcome), alpha = .5)   

    Error: Aesthetics must be either length 1 or the same as the data (606): colour, x, y
In addition: Warning messages:
1: In data.matrix(x) : NAs introduced by coercion
2: In data.matrix(x) : NAs introduced by coercion
3: In data.matrix(x) : NAs introduced by coercion
4: In data.matrix(x) : NAs introduced by coercion

我认为这两个问题都可以通过数据争用解决。当我刚接触R时,我很好奇它的灵活性,并且可以在不更改数据格式的情况下接收所需的绘图。

非常感谢,

Hana

1 个答案:

答案 0 :(得分:0)

是的,我认为扩大您的数据范围是一个很好的方法。这是一种实现方法,我已将其应用于iris数据帧的子集的长格式。

like_your_data <- structure(list(points = c(5.1, 4.9, 4.7, 4.6, 7, 6.4, 6.9, 5.5, 
6.3, 5.8, 7.1, 6.3), outcome = structure(c(1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 3L, 3L, 3L, 3L), .Label = c("setosa", "versicolor", 
"virginica"), class = "factor"), participant = c(1L, 2L, 3L, 
4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L)), class = c("tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -12L), .Names = c("points", 
"outcome", "participant"))

首先,我制作一个仅是setosa的版本(相当于您的scd_gb)。然后,我将其加入不包含setosa的版本。这样的效果是,将一列中的其他值与另一列中的调查类型相加。这可以与ggplot配合使用,因为我们可以将调查类型映射为颜色。

like_your_data %>%
  filter(outcome == "setosa") %>% # Equiv to scd_gb
  left_join(like_your_data %>% 
              filter(outcome != "setosa"), by = "participant") %>%
  ## Output at this point:
  # A tibble: 8 x 5
  #   points.x outcome.x participant points.y outcome.y 
  # <dbl> <fct>           <int>    <dbl> <fct>     
  # 1      5.1 setosa              1      7   versicolor
  # 2      5.1 setosa              1      6.3 virginica 
  # 3      4.9 setosa              2      6.4 versicolor
  ggplot(aes(points.x, points.y, color = outcome.y)) + geom_point()

enter image description here