所以我有一个数据集,我正在寻找上斜线的最大深度(由第一个深度值“ 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
答案 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
在该摘要中添加平均温度很简单。