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

5

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

我需要编写一个函数,从指定列中删除一些数字(2、5或10)行,并将它们放入另一个数据框中,然后为每个因子组合(在我的情况下:每天和服务器)执行此操作。

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

我根据所需参数(例如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行和最后X行,并创建一个包含这些行的第二个数据框? - Ernest A
不仅仅是每列的第一个和最后一个值,而是针对两个因素的每个组合,需要找出该列的最高和最低值。因此,对于两天和两台服务器,我需要找出第一天中服务器1和服务器2的前五名和最后五名,以及第二天中服务器1和服务器2的前五名和最后五名。 - Paweł Rumian
2个回答

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

可能有很多其他的选择,例如如果你的数据已经排序,可以使用headtail,但是这种方法应该也可以。


1
使用基本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), ]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接