繁体   English   中英

查找列中最大值的一半的位置

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM