考虑一下:
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。
我已经玩过聚集并怀疑这里有用,但我不确定如何继续。
非常感谢(对于我们这些新来的人来说,这个网站是一个巨大的资源!)
答案 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)
的数据表后,我们正在做两件事
[, cumsum(mean), by=.(plot, sp)]
计算mean
列的累计总和,按plot
和sp
分组[, .(sp = sp[V1 == max(V1)]), by=plot]
获取sp
的值V1
(在步骤1中计算)等于V1
的最大值,并重命名该列sp
,按plot
答案 1 :(得分:1)
不确定@jebyrnes是如何使用summarise
和filter
完成的(编辑:我发现它并且它也非常简单),但这里是我&我的方式#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)
汇总两次:一次计算每个plot
和sp
的总和,第二次计算每个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