R:识别与多个组的最高值相关联的因子

时间:2015-03-25 00:29:03

标签: r aggregate

考虑一下:

plot=c("A","A","A","A","B","B","B","B")
mean=c(3,5,40,0,3,5,3,0)
sp=c("ch","ch","ag",NA,"ch","ag","ch",NA)
df=data.frame(plot,mean,sp)

  plot mean   sp
1    A    3   ch
2    A    5   ch
3    A   40   ag
4    A    0 <NA>
5    B    3   ch
6    B    5   ag
7    B    3   ch
8    B    0 <NA>

我想找出一些会返回&#34; sp&#34;来自每个&#34;情节&#34;最高累积&#34;意味着&#34;值。对于上面的例子,我想返回这个:

plot=c("A","B")
sp=c("ag","ch")
df=data.frame(plot,sp)

  plot sp
1    A ag
2    B ch

如果不清楚,对于情节A,sp&#34; ag&#34;由于它具有最高的累积平均值(40),因此返回。对于情节B,&#34; ch&#34;返回,因为它具有最高的累积值(6)。价值观对我来说并不重要;我想要每个地块的累积平均值只有最主要的sp。

我已经玩过聚集并怀疑这里有用,但我不确定如何继续。

非常感谢(对于我们这些新来的人来说,这个网站是一个巨大的资源!)

4 个答案:

答案 0 :(得分:1)

这是一种使用&#34; data.table&#34;封装

library(data.table)
setDT(df)[, cumsum(mean), by=.(plot, sp)][, .(sp = sp[V1 == max(V1)]), by=plot]
#    plot sp
# 1:    A ag
# 2:    B ch

df设置为setDT(df)的数据表后,我们正在做两件事

  1. [, cumsum(mean), by=.(plot, sp)]计算mean列的累计总和,按plotsp分组
  2. [, .(sp = sp[V1 == max(V1)]), by=plot]获取sp的值V1(在步骤1中计算)等于V1的最大值,并重命名该列sp,按plot
  3. 分组

答案 1 :(得分:1)

不确定@jebyrnes是如何使用summarisefilter完成的(编辑:我发现它并且它也非常简单),但这里是我&我的方式#39; d使用dplyr

library(dplyr)
group_by(df, plot,sp) %>% summarise(sum=sum(mean)) %>% summarise(sp=sp[sum==max(sum)])
#  plot sp
#1    A ag
#2    B ch

答案 2 :(得分:0)

您应该可以分两步完成此操作。

步骤1,通过sp处的绘图聚合数据框并计算累积平均值。你可以使用plyr和ddply这样的软件包或dplyr软件包。

步骤2,一旦完成此操作,对于每个绘图输出,sp具有最高累积平均值。有很多方法可以解决这个问题。我再次使用dplyr,但那是因为我现在对它有点痴迷。

实际上......你可以用dplyr中的4行完成这一切,每行操作一行用magritr管道。 5如果你想摆脱累积平均值列。您只需要group_by,summarize和filter语句。如果您需要,我会发布代码,但是对您来说更有用,比如说http://seananderson.ca/2014/09/13/dplyr-intro.html并亲自尝试。

或者....

df %>%
  group_by(plot, sp) %>%
  summarise(cumMean = sum(mean, na.rm=T)) %>%
  filter(cumMean == max(cumMean)) %>% 
  select(plot, sp)

答案 3 :(得分:0)

汇总两次:一次计算每个plotsp的总和,第二次计算每个plot的最大值。然而,第二个聚合只会给你平均值,所以将它重新合并到第一个聚合中。

df2 = aggregate(mean ~ plot + sp, FUN = sum, data = df)
df3a = aggregate(mean ~ plot, data = df2, FUN = max)
merge(df3a, df2)

我还没有测试过如果你有相同数额的话,会发生什么。此外,这会丢弃数据帧中的任何NA。如果你想保留这些,我会确保你带数据框而不是因素,然后在开始之前将NA更改为占位符("None"甚至"NA")。上面的代码可以正常使用字符串!

df = data.frame(plot,mean,sp, stringsAsFactors = FALSE)
df[is.na(df$sp), "sp"] = "None"

> df
  plot mean   sp
1    A    3   ch
2    A    5   ch
3    A   40   ag
4    A    0 None
5    B    3   ch
6    B    5   ag
7    B    3   ch
8    B    0 None