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后,我们做了两件事
[, cumsum(mean), by=.(plot, sp)]
计算mean
列的累计和,按plot
和sp
分组
[, .(sp = sp[V1 == max(V1)]), by=plot]
采用 sp
值,其中 V1
(在步骤 1 中计算)等于 V1
的最大值,并将该列重命名为 sp
,按 plot
分组
您应该可以分两步完成此操作。
第 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 如何用 summarise
和 filter
完成它(编辑:我想通了,它也很简单),但这是我的处理方式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
聚合两次:一次计算每个 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
考虑一下:
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后,我们做了两件事
[, cumsum(mean), by=.(plot, sp)]
计算mean
列的累计和,按plot
和sp
分组
[, .(sp = sp[V1 == max(V1)]), by=plot]
采用sp
值,其中V1
(在步骤 1 中计算)等于V1
的最大值,并将该列重命名为sp
,按plot
分组
您应该可以分两步完成此操作。
第 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 如何用 summarise
和 filter
完成它(编辑:我想通了,它也很简单),但这是我的处理方式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
聚合两次:一次计算每个 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