我如何重塑具有多个相关二进制“观察”的数据,以便与ggplot很好地协作?

时间:2014-03-21 23:46:23

标签: r ggplot2 reshape

我遇到了数据纠纷问题。

根据观察,我的数据具有许多展示的“特征”,它们会产生结果以及花费的时间。

因此,例如,我们有这些数据。

participantID   observation treatment   duration    outcome feature.A   feature.B   feature.C   feature.D   feature.other
1   1   A   3.1 Successful  TRUE    FALSE   TRUE    FALSE   FALSE
1   2   A   2.1 Successful  TRUE    TRUE    FALSE   TRUE    FALSE
1   3   A   1.0 Unsuccessful    FALSE   FALSE   FALSE   FALSE   TRUE
1   4   A   5.1 Successful  TRUE    FALSE   TRUE    TRUE    FALSE
2   1   B   2.5 Unsuccessful    FALSE   FALSE   FALSE   FALSE   TRUE
2   2   B   3.1 Unsuccessful    TRUE    FALSE   TRUE    FALSE   FALSE
2   3   B   2.6 Successful  TRUE    TRUE    FALSE   FALSE   FALSE
2   4   B   2.8 Successful  TRUE    FALSE   TRUE    FALSE   FALSE
2   5   B   2   Unsuccessful    TRUE    TRUE    TRUE    TRUE    FALSE
2   6   B   3.6 Successful  TRUE    FALSE   TRUE    FALSE   FALSE
3   1   A   3.4 Successful  FALSE   FALSE   FALSE   FALSE   TRUE
3   2   A   3.5 Unsuccessful    TRUE    FALSE   TRUE    FALSE   FALSE

我们的想法是,我们有参与者尝试了不同的尝试(观察)。这些参与者在治疗组A或B中。根据他们的尝试,我们确定他们是成功还是不成功,以及持续时间他们的尝试。我们还确定他们是否使用了彼此不相互排斥的特定功能,但 feature.other 除外,只有在每个其他功能都是FALSE。

我希望能够使用类似于以下的命令在ggplot中绘制此数据:

ggplot(test, aes(x=observation, y=duration, fill=outcome)) + geom_bar(position="dodge", stat="identity") + facet_grid(participantID ~ feature.A + feature.B + feature.C + feature.D + feature.other)

此命令将打印特征和参与者的网格图,看起来像这样:

A sample output from ggplot

但是,我不确定这是使用数据的正确方法。我想要做的一件事是以某种方式将不同的“特征”变量合并为一个,所以我可以轻松地使用它(例如,如果我想构建堆积条形图,我可以将其添加为“特征” ggplot中的专栏)。

根据我的理解,我应该把它融化成长格式,对吧?但是如果我做错了,那么特征变量会最终复制观察数量,因为每个“TRUE”最终都会显示为一个ID,然后它会在计算观察结果时出现问题(特别是如果我cumsum s和类似的做添加)。

尝试:     重塑(测试,方向=“长”,变化= c(“feature.A”,“feature.B”,“feature.C”,“feature.D”,“feature.other”))#这给了我一些奇数输出,包括“时间”作为旧特征变量A / B / C / D /其他

但是当我绘制它时,它给出了没有意义的输出(例如,所有的条最终都是相同的高度)。

所以我的问题是:

如何格式化相关的二元因子(如特征),使其与reshape和ggplot很好地匹配,而不重复变量输出值?

我问这个是因为如果我想(稍后)绘制每次观察的持续时间的累积总和,使用重塑会妨碍:例如,如果我有一个重新塑造的数据框:

ddply(test_long, .(participantID), summarize,cumsum(duration))

会给我不正确的结果。我认为解决这个问题的一种方法是在融化之前简单地进行计算,但是以依赖于顺序的方式做事情比想法要少。

也许这也源于对“长”格式和“宽”格式是什么以及它们如何与ggplot交互的理解,如果有人可以简要地指出解释性资源以进一步理解我会很感激。

下面的输入数据:

test <- structure(list(participantID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L, 3L, 3L), observation = c(1L, 2L, 3L, 4L, 1L, 2L, 
3L, 4L, 5L, 6L, 1L, 2L), treatment = structure(c(1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L), .Label = c("A", "B"), class = "factor"), 
    duration = c(3.1, 2.1, 1, 5.1, 2.5, 3.1, 2.6, 2.8, 2, 3.6, 
    3.4, 3.5), outcome = structure(c(1L, 1L, 2L, 1L, 2L, 2L, 
    1L, 1L, 2L, 1L, 1L, 2L), .Label = c("Successful", "Unsuccessful"
    ), class = "factor"), feature.A = c(TRUE, TRUE, FALSE, TRUE, 
    FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE), feature.B = c(FALSE, 
    TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, 
    FALSE, FALSE), feature.C = c(TRUE, FALSE, FALSE, TRUE, FALSE, 
    TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE), feature.D = c(FALSE, 
    TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, 
    FALSE, FALSE), feature.other = c(FALSE, FALSE, TRUE, FALSE, 
    TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE)), .Names = c("participantID", 
"observation", "treatment", "duration", "outcome", "feature.A", 
"feature.B", "feature.C", "feature.D", "feature.other"), class = "data.frame", row.names = c(NA, 
-12L))

1 个答案:

答案 0 :(得分:2)

test_long = reshape(test, direction = 'long',
  idvar = 1:5, varying = 6:10, sep = ".",
)

rownames(test_long) = NULL


library(ggplot2)
ggplot(test_long, aes(x = observation, y = duration, fill = outcome)) +   
  geom_bar(position="dodge", stat="identity") + 
  facet_grid(participantID ~ time)