如何通过对某些列进行分组来重塑数据框

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 已将请求的编辑添加到问题中。

以上是关于如何通过对某些列进行分组来重塑数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何重塑数据框并将重复列转换为数据框行?

通过对数据框列中的值进行分组来绘制多个图?

按列表列中的元素对 Pandas 数据框进行分组

如何按“大陆”列对此数据框进行分组?

通过对不同列使用不同聚合的 pandas 数据框进行分组

如何根据某些分组列取消pandas数据框? [复制]