如何通过对某些列进行分组来重塑数据框
Posted
技术标签:
【中文标题】如何通过对某些列进行分组来重塑数据框【英文标题】:How can I reshape data frame by grouping certain columns 【发布时间】:2014-11-17 05:47:37 【问题描述】:假设我有一个包含 5 列的 R 数据框,如下所示
time MeanVar1 SdVar1 MedianVar1 MeanVar2 SdVar2
1 -0.8453978 -1.636985 -0.6239832 -0.4366982 -1.7037374
2 -0.3000778 -1.034199 0.3292459 -0.6606399 -0.1525361
有没有一种简洁的方法可以使dataFrame如下:
Var time Mean/Median SD
1 1 -0.8453978 -1.636985
1 2 -0.3000778 -1.034199
1 1 -0.6239832 N/A
1 2 0.3292459 N/A
2 1 -0.4366982 -1.7037374
2 2 -0.6606399 -0.1525361
或
Var time Mean/Median SD
MeanVar1 1 -0.8453978 -1.636985
MeanVar1 2 -0.3000778 -1.034199
MeanVar1 1 -0.6239832 N/A
MeanVar1 2 0.3292459 N/A
MeanVar2 1 -0.4366982 -1.7037374
MeanVar2 2 -0.6606399 -0.1525361
我的总体意图是在同一个图中用误差线、变量 1 的中值和变量 1 的平均值、标准差绘制变量 1 的均值、标准差。因此,我觉得如果我把数据修改成这样的格式,我可以一次绘制,而不是单独绘制每一行。
由于我对重塑和融化的了解有限,我无法做到这一点。
编辑:添加更多信息
示例输入(给定 3 行,总共有 100 行):
Label trainingSize Accuracy_Mean Accuracy_SD Accuracy_SE Precision_Mean Recall_Mean F1 Accuracy_Median PriorClass0_Mean PriorClass0_SD PriorClass0_SE ProbabilityEstimate_0given0_Mean ProbabilityEstimate_0given0_SD ProbabilityEstimate_0given0_SE ProbabilityEstimate_0given1_Mean ProbabilityEstimate_0given1_SD ProbabilityEstimate_0given1_SE
0perc_0repeat 0.4 0.5506 0.0531 0.0038 0.6374 0.2336 0.3419 0.5372 0.5278 0.0254 0.0018 0.6433 0.0028 0.0 0.4169 0.003 0.0
0perc_0repeat 0.4 0.5456 0.0482 0.0034 0.6465 0.2142 0.3218 0.5333 0.5304 0.0248 0.0018 0.6414 0.0028 0.0 0.4193 0.0027 0.0
0perc_0repeat 0.4 0.5574 0.0555 0.0039 0.6604 0.2197 0.3297 0.5404 0.529 0.0233 0.0016 0.6436 0.003 0.0 0.4163 0.0029 0.0
我正在尝试绘制
1) the iteration number(1:100) in X Axis and the points of 5 columns (Accuracy_Mean, Accuracy_Median, PriorClass0_Mean, ProbabilityEstimate_0given0_Mean, ProbabilityEstimate_0given1_Mean in the Y AXIS.
2) distribution (density obtained by 100 points) of 5 columns with error bars (either SD or SE) in a single plot using ggplot.
我有 4 列 Precision_Mean、Recall_Mean、F1、Accuracy_Median 不遵循均值、sd、se 模式!
编辑1: 1)
dput(droplevels(head(data, 3))) 结构(列表(标签=结构(c(1L,1L,1L),.Label =“0perc_0repeat”,class=“因子”), trainingSize = c(0.4, 0.4, 0.4), Accuracy_Mean = c(0.5506, 0.5456, 0.5574), Accuracy_SD = c(0.0531, 0.0482, 0.0555), Accuracy_SE = c(0.0038, 0.0034, 0.0039), Precision_Mean = c(0.6374, 0.6465, 0.6604), Recall_Mean = c(0.2336, 0.2142, 0.2197), F1 = c(0.3419, 0.3218, 0.3297), Accuracy_Median = c(0.5372, 0.5333, 0.5404), PriorClass0_Mean = c(0.5278, 0.5304, 0.529 ), PriorClass0_SD = c(0.0254, 0.0248, 0.0233), PriorClass0_SE = c(0.0018, 0.0018, 0.0016), ProbabilityEstimate_0given0_Mean = c(0.6433, 0.6414, 0.6436), ProbabilityEstimate_0given0_SD = c(0.0028, 0.0028, 0.003), ProbabilityEstimate_0given0_SE = c(0, 0, 0), ProbabilityEstimate_0given1_Mean = c(0.4169, 0.4193, 0.4163), ProbabilityEstimate_0given1_SD = c(0.003, 0.0027, 0.0029), ProbabilityEstimate_0given1_SE = c(0, 0, 0)), .Names = c("标签", “trainingSize”、“Accuracy_Mean”、“Accuracy_SD”、“Accuracy_SE”、 “Precision_Mean”、“Recall_Mean”、“F1”、“Accuracy_Median”、“PriorClass0_Mean”、 “PriorClass0_SD”、“PriorClass0_SE”、“ProbabilityEstimate_0given0_Mean”、 “ProbabilityEstimate_0given0_SD”,“ProbabilityEstimate_0given0_SE”, “ProbabilityEstimate_0given1_Mean”,“ProbabilityEstimate_0given1_SD”, "ProbabilityEstimate_0given1_SE"), row.names = c(NA, 3L), class= "data.frame")
2) 预期输出类似于:
Vars Label trainingSize Mean SD SE
变量:平均值、PriorClass0、ProbabilityEstimate_0given0、ProbabilityEstimate_0given1; (Median、Precision、Recall、F1 不是必需的,或者它们可以适合上表,SD、SE 为 N/A 或 0)。
【问题讨论】:
也不清楚为什么NA
值应该进来......
您的担忧是真实的。但是请您不要想太多,我只是想要这种格式的数据。 NA 进来是因为我希望将数据框细分为两列(分组均值和标准差),并且由于 Median 没有匹配的列,所以今天,我想要一个 N/A 或 0 的列。
【参考方案1】:
我的“splitstackshape”包中的merged.stack
在一定程度上处理了这个问题,但它会回收“SdVar”列中的值(所以我没有得到您在所需输出中显示的NA
值)。
尽管如此,这可能是解决您的问题的开始,所以方法如下:
library(splitstackshape)
merged.stack(mydf, var.stubs = c("MeanVar|MedianVar", "SdVar"), sep = "var.stubs")
# time .time_1 MeanVar|MedianVar SdVar
# 1: 1 1 -0.8453978 -1.6369850
# 2: 1 1 -0.6239832 -1.6369850
# 3: 1 2 -0.4366982 -1.7037374
# 4: 2 1 -0.3000778 -1.0341990
# 5: 2 1 0.3292459 -1.0341990
# 6: 2 2 -0.6606399 -0.1525361
如果你真的想要那些 NA
值,也许这样就可以了:
merged.stack(
mydf, var.stubs = c("MeanVar|MedianVar", "SdVar"),
sep = "var.stubs")[, SdVar := ifelse(
duplicated(SdVar), NA, SdVar), by = time][]
# time .time_1 MeanVar|MedianVar SdVar
# 1: 1 1 -0.8453978 -1.6369850
# 2: 1 1 -0.6239832 NA
# 3: 1 2 -0.4366982 -1.7037374
# 4: 2 1 -0.3000778 -1.0341990
# 5: 2 1 0.3292459 NA
# 6: 2 2 -0.6606399 -0.1525361
【讨论】:
似乎是一个很好的起点,谢谢!你能解释一下那一行代码的作用吗?我认为 VarStubs 中的名称需要与数据框中的列名相对应,但不确定如何理解。我问是因为我在数据框中的列名更复杂,我只是为了简单起见(例如 MeanVar1 = Accuracy_Mean 和 MeanVar2 = Parameter_Mean)......谢谢! @PraveenKumar,var.stubs
应该是构成每个变量组的前缀。由于这是基于正则表达式,我们可以使用|
符号组合组。因此,如果我们有类似“Mean|Median”的内容,它会匹配名称中同时包含“Mean”和“Median”的列。 “.time_1”变量是从删除列名的那部分后剩下的任何内容创建的。如果没有您身边的一些示例输入/输出,很难为您提供更精确的响应。
@Ananada Mahto,用我要解决的确切问题和数据编辑问题。希望能帮助你给我一个准确的答案。不要劫持这个问题,但如果您知道我可以完成绘图的任何其他方式(或数据格式),那就太好了!
@PraveenKumar,请编辑您的问题以包括 (1) dput(droplevels(head(your-data-frame, 3)))
的输出,以便您的数据易于重现,以及 (2) 该样本的预期输出,以便在您正在寻找的条款。
@Anada Mahto 已将请求的编辑添加到问题中。以上是关于如何通过对某些列进行分组来重塑数据框的主要内容,如果未能解决你的问题,请参考以下文章