【问题标题】:How do I l reshape data that has multiple related binary "observations" so that works nicely with ggplot?我如何重塑具有多个相关二进制“观察”的数据,以便与 ggplot 很好地配合?
【发布时间】:2014-04-29 13:43:32
【问题描述】:

我遇到了数据整理问题。

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

例如,我们有这些数据。

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。根据他们的尝试,我们确定他们是成功还是不成功,以及持续时间 他们的尝试。我们还确定他们是否使用了特定的 features,它们彼此不是互斥的,但 feature.other 除外,它仅在所有其他功能都满足时才为 TRUE错误。

我希望能够使用类似于以下的命令在 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)

此命令将打印特征和参与者的网格图,如下所示:

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

据我了解,我应该将其分解为长格式,对吗?但是如果我这样做不正确,特征变量最终会重复观察的数量,因为每个“TRUE”最终都会显示为一个 ID,然后最终会出现计算观察的问题(特别是如果我这样做 cumsums 和类似于做加法)。

尝试: reshape(test, direction="long", varying=c("feature.A", "feature.B", "feature.C", "feature.D", "feature.other")) # 这给了我一些奇数输出,包括“时间”作为旧特征变量 A/B/C/D/other

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

所以我的问题是:

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

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

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))

【问题讨论】:

  • 你看melt了吗?
  • 是的,如果我融化了,我会得到重复的观测值,最终导致很难进行累积总和。
  • 我认为您需要重新表述您的问题。你似乎有很多不同的情节和目标,很难用一种魔法来满足所有这些command()。不幸的是,这是一种非常标准的数据整理方法:事物常常 依赖于顺序。一个环绕你的函数的脚本将有助于保持工作正常。那么 - 你的近期目标是什么?
  • @AndyClifton 我会问一个单独的问题作为细分。

标签: r ggplot2 reshape


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

【讨论】:

  • 为什么我必须将 rownames(test_long) 设置为 NULL?
  • 没必要。我只是这样做了,因为设置的行名很长,而且我不喜欢在检查数据框时打印它们。
猜你喜欢
  • 2021-07-23
  • 2015-06-15
  • 2021-11-16
  • 2015-07-25
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
  • 2011-07-30
  • 2011-09-08
相关资源
最近更新 更多