我有一个神经认知研究的数据。我们通过三项略有不同的调查来衡量结果,参与者获得的可能分数范围相同。我的数据格式很长,也就是说,每个参与者都有三行,分别是变量points
和outcome
。变量outcome
表示在给定行(scd_gb
,scd_rb
或scd_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_gb
和scd_gb
&scd_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
答案 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()