【发布时间】: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 我会问一个单独的问题作为细分。