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”
    be
    df[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