R:确定与多个组的最大值和相关的系数
考虑这一点:R:确定与多个组的最大值和相关的系数,r,aggregate,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
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>
如果不清楚,则对于地块A,返回sp“ag”,因为它具有该地块的最高累积平均值(40)。对于图B,返回“ch”,因为它具有最高的累积值(6)。价值观对我来说并不重要;我只想要每个图的累积平均值中最主要的sp
我已经使用了aggregate,并怀疑它在这里会有用,但我不确定如何继续
非常感谢(对于我们这些刚接触R的人来说,这个网站是一个巨大的资源!)这里有一个使用“data.table”包的方法 在使用
setDT(df)
将df
设置到数据表之后,我们做了两件事
[,cumsum(mean),by=(plot,sp)]
计算mean
列的累积和,按plot
和sp
[,(sp=sp[V1==max(V1)],by=plot]
获取sp
值,其中V1
(在步骤1中计算)等于V1
的最大值,并重命名该列sp
,按plot
分组您应该能够通过两个步骤来完成此操作 步骤1,在sp处按图聚合数据帧,并计算累积平均值。为此,您可以使用plyr with ddply或dplyr包 步骤2,完成此操作后,对于每个绘图输出具有最高累积平均值的sp。有很多方法可以做到这一点。我会再次选择dplyr,但那是因为我现在有点被它迷住了 事实上,你可以在dplyr中使用4行代码来完成整个过程,每个操作一行代码通过magritr。5如果你想去掉累积平均值列。您只需要一个groupby、summary和filter语句。如果你想要的话,我会发布代码,但是如果你自己去读、说、试一下,它会更有用 或者
df %>%
group_by(plot, sp) %>%
summarise(cumMean = sum(mean, na.rm=T)) %>%
filter(cumMean == max(cumMean)) %>%
select(plot, sp)
不确定@jebyrnes如何使用
summary
和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
聚合两次:一次计算每个
绘图
和sp
的总和,第二次计算每个绘图
的最大值。不过,第二个聚合只会给出平均值,所以将其与第一个聚合合并
df2 = aggregate(mean ~ plot + sp, FUN = sum, data = df)
df3a = aggregate(mean ~ plot, data = df2, FUN = max)
merge(df3a, df2)
不过,我还没有测试如果这里有相等的和会发生什么。此外,这会在数据帧中删除任何NAs。如果您想保留这些内容,我会确保在开始之前将数据帧与字符串而不是因子一起引入,然后将NAs更改为占位符(“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
谢谢你,理查德。您的解决方案在我的简单数据集上非常有效,但当我将其应用于实际数据时,发生了一件奇怪的事情。我有相当多的绘图,其中“平均”值只有0,而“sp”值只有NAs;对于这些绘图,此解决方案返回一行,该绘图中的每一行都带有NA。我应该有远见在我的示例中包含一个只有0/NAs的绘图。这可能不是一个困难的解决办法,但是@jebyrnes的建议让我达到了我想要的目的,所以我没有玩弄它。谢谢。是否应该
df[is.na(df$sp),“sp”]=“None”
bedf[is.na(df$sp),“na”]=“None”
?后者对我有效,但前者没有(可能是我自己的无知!)。在我的示例中,我没有提到我的数据包括许多图,其中“平均”值只有0,而“sp”值只有NAs。这段代码似乎忽略了这些情节。我没有提到他们的存在,这是我的错。听到这个我很惊讶!后者肯定不应该(对我来说,也不应该)起作用。原因是df[X,Y]=“None”
以df
行X
和列Y
的单元格为目标X
是我们的一个条件:其sp
列为NA
的行Y
以名为sp
的列为目标。基本上,使用后一个代码,您将得到一个名为“NA”
的新列;矿山覆盖sp
列中的NA
s。将此操作视为选择行(基于is.nsa()
),然后编辑列。谢谢。您编辑的代码是我第一次能够使用我的数据,所以我使用了它。我将花一些时间熟悉dplyr——感谢您在逻辑和建议方面所做的工作。
df2 = aggregate(mean ~ plot + sp, FUN = sum, data = df)
df3a = aggregate(mean ~ plot, data = df2, FUN = max)
merge(df3a, df2)
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