AVE vs MAX数据使用和要求?

时间:2018-11-01 19:12:02

标签: r function max average

所以我有一个数据集,我正在寻找上斜线的最大深度(由第一个深度值“ 0”和“ T”之间的间隔表示) 因此,例如,站点“ A”的最大深度为“ 2”,站点“ B”的最大深度为“ 5”。

SITE_ID DEPTH METALIMNION TEMP_FIELD 
  A      0                    25.0            
  A      1                    26.0
  A      2                    27.0
  B      0                    10.0
  B      5         T          9.0
  B      10                   11.0
  B      15        B          21.0

对于同一数据集,我使用

得出了Epilimnion的平均温度
g <- with(df, ave(as.character(METALIMNION), SITE_ID, 
          FUN = function(x) {
            x[is.na(x)] <- ""
            rev(cumsum(rev(x) == "T"))
            }))
df$EPI.T <- ave(df$TEMP_FIELD, df$SITE_ID, g)

但是,当尝试使用'max'函数时,该代码不起作用。

df$EPI.D <- max(df$DEPTH, df$SITE_ID, g)

“ max”是否需要与“ ave”不同的数据类型?  理想的最终数据集:

SITE_ID DEPTH METALIMNION TEMP_FIELD EPI.T EPI.D
  A      0                    25.0   26.0   2     
  A      1                    26.0   26.0   2
  A      2                    27.0   26.0   2
  B      0                    10.0   10.25  5
  B      5         T          9.0    10.25  5
  B      10                   11.0   10.25  5
  B      15        B          21.0   10.25  5

1 个答案:

答案 0 :(得分:0)

我不确定您是如何得出平均值/均值的,我不是在运行代码时会得到相同的结果。无论如何,您的max(...)方法行不通,因为max(...)avg(...)完全不同(后者是将功能应用于组的功能)。 max(...)仅计算值向量的最大值。从这个意义上讲,max(...)更像mean(...),而不像avg(...)

以下内容查找“ T之前”的每个组中DEPTH的最大值。即假设您的数据按DEPTH进行了排序。以下还假设每个组中的最小值始终为0。

df <- read.table(header=TRUE,sep=",",stringsAsFactors = FALSE, strip.white = TRUE,text="
SITE_ID, DEPTH, METALIMNION, TEMP_FIELD, EPI.T, EPI.D
A,      0,          ,          25.0,   26.0,   2     
A,      1,          ,          26.0,   26.0,   2
A,      2,          ,          27.0,   26.0,   2
B,      0,          ,          10.0,   10.25,  5
B,      5,         T,          9.0,    10.25,  5
B,      10,         ,          11.0,   10.25,  5
B,      15,        B,          21.0,   10.25,  5")


library(dplyr)

max_by_grp <- df %>% 
  group_by(SITE_ID) %>% 
  filter(row_number() <= min(which(METALIMNION=="T"), n())) %>%
  summarise(max = max(DEPTH))

print(max_by_grp)
## A tibble: 2 x 2
#  SITE_ID   max
#  <chr>   <dbl>
#1 A           2
#2 B           5

res <- merge(df, max_by_grp)
print(res)
#  SITE_ID DEPTH METALIMNION TEMP_FIELD EPI.T EPI.D max
#1       A     0                     25 26.00     2   2
#2       A     1                     26 26.00     2   2
#3       A     2                     27 26.00     2   2
#4       B     0                     10 10.25     5   5
#5       B     5           T          9 10.25     5   5
#6       B    10                     11 10.25     5   5
#7       B    15           B         21 10.25     5   5

在该摘要中添加平均温度很简单。