R:确定与多个组的最高值总和相关的因素

R: identify the factor associated with the highest sum of values for multiple groups

考虑一下:

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>

我想找出一些代码,将 return 来自每个具有最高累积 "mean" 值的 "plot" 的 "sp"。对于上面的例子,我想 return 这个:

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

  plot sp
1    A ag
2    B ch

如果不清楚,对于图 A,sp "ag" 是 returned 因为它具有该图的最高累积平均值 (40)。对于图 B,"ch" 被 return 编辑,因为它具有最高的累积值 (6)。这些价值观对我来说并不重要;我只想要每个地块的累积平均值最主要的 sp。

我玩过 aggregate 并怀疑它在这里有用,但不确定如何继续。

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

这是一个使用 "data.table" 包的方法

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

setDT(df)df设置为数据table后,我们做了两件事

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

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

第 1 步,按 sp 处的图聚合数据框并计算累积平均值。为此,您可以使用 plyr 和 ddply 或 dplyr 等软件包。

第 2 步,完成此操作后,为每个绘图输出具有最高累积平均值的 sp。有很多方法可以做到这一点。我会再次选择 dplyr,但那是因为我现在有点迷恋它。

实际上...您可以在 dplyr 中用 4 行来完成这整个事情,每个操作一行用 magritr 管道进行。 5 如果要去掉累积均值列。您只需要 group_by、汇总和过滤语句。如果你需要,我会 post 代码,但是你去阅读 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)

不确定@jebyrnes 如何用 summarisefilter 完成它(编辑:我想通了,它也很简单),但这是我的处理方式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

聚合两次:一次计算每个 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