【问题标题】:Extract rows with highest and lowest values from a data frame从数据框中提取具有最高和最低值的行
【发布时间】:2012-11-05 01:57:53
【问题描述】:

我对 R 很陌生,我主要将它用于使用 ggplot2 库来可视化统计数据。现在我遇到了数据准备的问题。

我需要编写一个函数,它将从数据框中删除一些(2、5 或 10)行,这些​​行在指定列中具有最高和最低值,并将它们放入另一个数据框中,并对每个组合执行此操作两个因素(在我的情况下:每天和服务器)。

到目前为止,我已经完成了以下步骤(MWE 使用esoph 示例数据集)。

我已经根据所需的参数对框架进行了排序(例如ncontrols):

esoph<-esoph[with(esoph,order(-ncontrols)) ,]

我可以显示每个因子值的第一条/最后一条记录(在此示例中为每个年龄范围):

by(data=esoph,INDICES=esoph$agegp,FUN=head,3)
by(data=esoph,INDICES=esoph$agegp,FUN=tail,3)

所以基本上,我可以看到最高和最低值,但我不知道如何将它们提取到另一个数据框中以及如何从主要数据框中删除它们。

同样在上面的示例中,我可以看到一个因素(年龄范围)的每个值的最高/最低记录,但实际上我需要知道 两个 因素的每个值的最高和最低记录-- 在本例中,它们可能是agegpalcgp

我什至不确定上述这些步骤是否可行 - 也许使用 plyr 会更好?我会很感激任何提示。

【问题讨论】:

  • 所以您只是想删除数据框的第一行和最后 X 行并创建包含这些行的第二个数据框?
  • 不仅仅是第一个和最后一个,而是两个因素的每个组合的最高和最低值(对于来自一列的值)。因此,对于两天和两台服务器,我需要第一天的 server1 和 server2 的前 5 个和最低的 5,第 2 天的 server1 和 server2 的前 5 个和最低的 5。

标签: r dataframe plyr subset outliers


【解决方案1】:

是的,您可以使用plyr,如下所示:

esoph <- data.frame(agegp = sample(letters[1:2], 20, replace = TRUE),
                    alcgp = sample(LETTERS[1:2], 20, replace = TRUE),
                    ncontrols = runif(20))

ddply(esoph, c("agegp", "alcgp"),
      function(x){idx <- c(which.min(x$ncontrols),
                           which.max(x$ncontrols))
                  x[idx, , drop = FALSE]})
#   agegp alcgp  ncontrols
# 1     a     A 0.03091483
# 2     a     A 0.88529790
# 3     a     B 0.51265447
# 4     a     B 0.86111649
# 5     b     A 0.28372232
# 6     b     A 0.61698401
# 7     b     B 0.05618841
# 8     b     B 0.89346943

ddply(esoph, c("agegp", "alcgp"),
      function(x){idx <- c(which.min(x$ncontrols),
                           which.max(x$ncontrols))
                  x[-idx, , drop = FALSE]})
#    agegp alcgp ncontrols
# 1      a     A 0.3745029
# 2      a     B 0.7621474
# 3      a     B 0.6319013
# 4      b     A 0.3055078
# 5      b     A 0.5146028
# 6      b     B 0.3735615
# 7      b     B 0.2528612
# 8      b     B 0.4415205
# 9      b     B 0.6868219
# 10     b     B 0.3750102
# 11     b     B 0.2279462
# 12     b     B 0.1891052

可能有很多选择,例如如果您的数据已经排序,则使用 headtail,但这应该可以工作。

【讨论】:

    【解决方案2】:

    使用基础 R:

    newesoph <- esoph[esoph$ncontrols == ave(esoph$ncontrols,list(esoph$agegp,esoph$alcgp),FUN = max) 
            | esoph$ncontrols == ave(esoph$ncontrols,list(esoph$agegp,esoph$alcgp),FUN = min), ]
    

    【讨论】:

      猜你喜欢
      • 2013-05-30
      • 2020-07-13
      • 2019-07-04
      • 2023-01-30
      • 2021-07-10
      • 1970-01-01
      • 2014-05-27
      • 1970-01-01
      • 2022-01-19
      相关资源
      最近更新 更多