[英]Finding the location of half the max value in a column
我有一个数据框列表,我想对该列表应用一个函数,以在“julian”列中找到对应于“total_cover”列中最大值一半的位置。 这是一些代表我拥有的数据的数据:
df1 <- data.frame(julian = c(81,85,88,97,101,104,126,167),
total_cover = c(43,52,75,92,94,97,188,172))
df2 <- data.frame(julian = c(81,85,88,97,101,104,126,167),
total_cover = c(30,55,73,80,75,85,138,154))
df3 <- data.frame(julian = c(107,111,115,119,123,129,131,133,135,137),
total_cover = c(36,41,43,47,55,55,55,65,75,80))
data.list <- list(df1=df1,df2=df2,df3=df3)
下面的代码是我试过的,但我没有得到正确的输出。 这似乎没有找到对应于最大值一半的儒略日
unlist(lapply(X = data.list, FUN = function(x){
x[which.max(x[["total_cover"]] >= which.max(x[["total_cover"]])/2), "julian"]
}))
output:
df1 df2 df3
81 81 107
我的理想输出如下所示,朱利安日期对应于 >= max(total_cover)/2
df1 df2 df3
101 97 111
使用 R 4.2.2
find_julian <- function(df){
#calculate the distance from half of the maximum
distance <- df[["total_cover"]]- max(df[["total_cover"]])/2
#find smallest value greater than half of the maximum and select corresponding julian
df[distance==min(distance[distance>=0]),"julian"]
}
unlist(lapply(X = data.list, FUN = find_julian))
df1 df2 df3
101 97 111
我相信以下回答了这个问题。
sapply(data.list, \(x) {
half_max <- max(x$total_cover)/2
d <- abs(x$total_cover - half_max)
is.na(d) <- x$total_cover < half_max
x$julian[which.min(d)]
})
#> df1 df2 df3
#> 101 97 111
创建于 2022-12-13,使用reprex v2.0.2
这是一步一步的dplyr
解决方案:主要问题是差异有时是负数,我们必须删除它们:
的结果
df1 df2 df3
81 81 107
发生是因为代码没有考虑负数!
长版:
library(dplyr)
bind_rows(data.list, .id = 'id') %>%
group_by(id) %>%
mutate(x = (max(total_cover)/2)) %>%
mutate(y = total_cover-x) %>%
filter(y >=0) %>%
filter(y == min(y)) %>%
select(1:2) %>%
pull(julian, name = id)
或者更短一点:
bind_rows(data.list, .id = 'id') %>%
group_by(id) %>%
filter(total_cover-(max(total_cover)/2) >=0) %>%
filter(total_cover == min(total_cover)) %>%
select(1:2) %>%
pull(julian, name = id)
结果:
df1 df2 df3
101 97 111
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.