从数据框中提取具有最高和最低值的行

Paw*_*ian 5 r subset outliers plyr dataframe

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

我需要编写一个函数,该函数将从指定的列中具有最高和最低值的数据框中删除一些(2、5或10)行,并将其放入另一个数据框中,并针对两个因素的每种组合进行此操作(就我而言:每天和每台服务器)。

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

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

esoph<-esoph[with(esoph,order(-ncontrols)) ,]
Run Code Online (Sandbox Code Playgroud)

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

by(data=esoph,INDICES=esoph$agegp,FUN=head,3)
by(data=esoph,INDICES=esoph$agegp,FUN=tail,3)
Run Code Online (Sandbox Code Playgroud)

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

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

我什至不确定上述步骤是否可以-也许使用plyr会更好?我将不胜感激。

flo*_*del 3

是的,您可以按如下方式使用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
Run Code Online (Sandbox Code Playgroud)

可能有很多替代方案,例如使用headtail如果您的数据已经排序,但这应该可行。