【问题标题】:How do you plot/analyze variables in R based on their common value in a data frame?您如何根据数据框中的共同值绘制/分析 R 中的变量?
【发布时间】:2013-12-05 23:19:42
【问题描述】:

我正在使用一个包含实验数据的数据框。出于本文的目的,我们可以将讨论限制为 3 列:ExperimentID、ROI、isContrast、isTreated 和 Value。 ROI 是一个基于文本的因子,指示绘制感兴趣区域的位置,例如'ROI_1'、'ROI_2'、...等。 isTreatated 和 isContrast 是指示是否应用了某种处理的二进制字段。我想制作一个散点图,比较例如“ROI_1”与“ROI_2”的值,这意味着我需要以这样的方式配对数据,当我绘制它时,第一个 X 值来自 Experiment_1 和 ROI_1,第一个 Y 值来自 Experiment_1 和 ROI_2,下一个 X 值来自 Experiment_2 和 ROI_1,下一个 Y 值来自 Experiment_2 和 ROI_2,等等。我只想对 isContrast 和 isTreated 的常见值进行比较(即 1 个绘图这些变量的每个组合,所以总共 4 个图。

子集并不能解决我的问题,因为来自不同实验/ROI 的数据有时输入的数字顺序不正确。

以下代码生成一个模拟数据集来演示问题

expID =      c('Bob','Bob','Bob','Bob','Lisa','Lisa','Lisa','Lisa','Alice','Alice','Alice','Alice','Joe','Joe','Joe','Joe','Bob','Bob','Alice','Alice','Lisa','Lisa')
treated  = c(0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0)
contrast = c(0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1)
val = c(1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,6,7,8,9,10,11)
roi = c(rep('A',16),'B','B','B','B','B','B')

myFrame = data.frame(ExperimentID=expID,isTreated = treated, isContrast= contrast,Value = val, ROI=roi)

     ExperimentID isTreated isContrast Value ROI
1           Bob         0          0     1   A
2           Bob         0          1     2   A
3           Bob         1          0     3   A
4           Bob         1          1     4   A
5          Lisa         0          0     1   A
6          Lisa         0          1     2   A
7          Lisa         1          0     3   A
8          Lisa         1          1     4   A
9         Alice         0          0     1   A
10        Alice         0          1     2   A
11        Alice         1          0     3   A
12        Alice         1          1     4   A
13          Joe         0          0     1   A
14          Joe         0          1     2   A
15          Joe         1          0     3   A
16          Joe         1          1     4   A
17          Bob         0          0     6   B
18          Bob         0          1     7   B
19        Alice         0          0     8   B
20        Alice         0          1     9   B
21         Lisa         0          0    10   B
22         Lisa         0          1    11   B

现在假设我想散布 A 与 B 的绘图值。也就是说,我想绘制 x 与 y 的图,其中 {(x,y)} = {(Bob's Value from ROI A, Bob's Value来自 ROI B)、(来自 ROI A 的 Alice 值、来自 ROI B 的 Alices 值)}、...} 等,这些都必须具有相同的 isTreatated 和 isContrast 值,以便比较有意义。现在,如果我只是去一个子集,我会得到类似的东西:

> x= myFrame$Value[(myFrame$ROI == 'A') & (myFrame$isTreated == 0) & (myFrame$isContrast == 0)]
> x
[1] 1 1 1 1

> y= myFrame$Value[(myFrame$ROI == 'B') & (myFrame$isTreated == 0) &   (myFrame$isContrast == 0)]
> y
 [1]  6  8 10

现在您可以看到,y 中的值分别对应于 Bob、Lisa、Alice 和 Joe 的第一行,但 y 分别对应于 Bob、Alice 和 Lisa 的值,并且 Joe 没有任何值。

假设我忽略了 Joe 的值,因为 B 缺少该数据,只是决定绘制 x 的前 3 个值与 y 的前 3 个值。数据仍然是乱序的,因为 x = (Bob, Lisa, Alice) 但 y = (Bob, Alice, Lisa) 就值的来源而言。所以我现在想知道如何制作向量,使得顺序正确并且情节有意义。

【问题讨论】:

  • 子集时,顺序无关紧要。也许你可以做你的例子reproducible?你试过什么?
  • 我意识到当子集顺序无关紧要时,但我不确定除了循环遍历 ExperimentID 和 ROI 的所有可能值的 for 循环之外的任何其他方法根据 ROI 的值手动将它们分类为 x 和 y 向量。我的直觉是,必须有更好的方法来解决这个问题。我的数据框很大,包含未发布的数据,所以我不想在这里发布。
  • 如果你说你明白顺序与子集无关,我很困惑,但你也说“子集不能解决我的问题,因为数据......有时输入数字顺序。”
  • 我对这个问题做了很多尝试。这是未发布的患者数据,因此无法复制到互联网上。我意识到我的问题会被数据澄清,但这是不可能的。无论如何,谢谢你的帮助。
  • 您可能无法共享数据,但您可以共享您的代码,这将大大有助于我们为您提供帮助。我强烈建议您按照上面的可重现示例链接,并使用与您的数据具有相同结构但使用虚构数据的玩具数据集发布您的代码。

标签: r plot dataframe


【解决方案1】:

类似于@Matthew,带有 ggplot:

我们的想法是重塑您的数据,使 ROI=A 和 RIO=B 的值位于不同的列中。这可以(使用您的示例数据)如下完成:

library(reshape2)
zz <- dcast(myFrame,
            value.var="Value",
            formula=ExperimentID+isTreated+isContrast~ROI)
zz
   ExperimentID isTreated isContrast A  B
1         Alice         0          0 1  8
2         Alice         0          1 2  9
3         Alice         1          0 3 NA
4         Alice         1          1 4 NA
5           Bob         0          0 1  6
6           Bob         0          1 2  7
7           Bob         1          0 3 NA
8           Bob         1          1 4 NA
9           Joe         0          0 1 NA
10          Joe         0          1 2 NA
11          Joe         1          0 3 NA
12          Joe         1          1 4 NA
13         Lisa         0          0 1 10
14         Lisa         0          1 2 11
15         Lisa         1          0 3 NA
16         Lisa         1          1 4 NA

请注意,您的样本数据相当稀疏(很多 NA)。

绘制:

library(ggplot2)
ggplot(zz,aes(x=A,y=B,color=factor(isTreated))) + 
  geom_point(size=4)+facet_wrap(~isContrast)

产生这个:

没有蓝点的原因是,在您的样本数据中,没有出现isTreated=1 和ROI=B。

【讨论】:

  • 使用ggplot和reshape2。
【解决方案2】:

可能是这样的:

myFrameReshaped <- reshape(myFrame, timevar='ROI', direction='wide', idvar=c('ExperimentID','isTreated','isContrast'))
plot(Value.B ~ Value.A, data=myFrameReshaped)

要通过isTreated 和isContrast 变量进行条件化,lattice 就派上用场了:

library(lattice)
xyplot(Value.B~Value.A | isTreated + isContrast, data=myFrameReshaped)

其中一种条件不存在的值给出 NA,并且不会被绘制。

head(myFrameReshaped)
##   ExperimentID isTreated isContrast Value.A Value.B
## 1          Bob         0          0       1       6
## 2          Bob         0          1       2       7
## 3          Bob         1          0       3      NA
## 4          Bob         1          1       4      NA
## 5         Lisa         0          0       1      10
## 6         Lisa         0          1       2      11

【讨论】:

    猜你喜欢
    • 2014-12-14
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    相关资源
    最近更新 更多