问题描述
我正在尝试围绕另一个变量的峰值探索分组数据集中的 1 个变量的值。我的数据集非常大(4000 组)。为清楚起见,让我们看一个带有 iris
的示例。我想首先确定每个物种的萼片长度峰值。
id <- as.numeric(iris$Species)
iris2 <- cbind(iris,id)
require(purrr)
result <- iris2 %>%
split(.$id) %>%
map(~quantmod:: findPeaks(.$Sepal.Length,thresh= 0 ))
使用上述方法,我设法确定了每个组 id 的萼片长度有峰值的行号:
> $`1` [1] 7 9 12 14 16 20 22 25 30 33 35 38 41 46 48 50
>
> $`2` [1] 4 6 8 10 15 17 20 24 28 35 38 43 49
>
> $`3` [1] 4 7 9 11 14 20 22 24 27 33 37 39 41 43 45 47 49
接下来,我想确定之前确定的各个位置的萼片宽度值。基本上,我想找到每组中的最大和最小隔板宽度值,并检查它们是否接近萼片长度的峰值,特别是前后 5 行。我想添加一个 TRUE/FALSE 列,用于根据此标准检查每个 ID。
嵌套列表似乎是一个使用起来很复杂的结构,因此我将其转换为数据框:
library(data.table)
dfs <- lapply(result,data.frame,stringsAsFactors = FALSE)
r_df <- rbindlist(dfs,use.names = TRUE,fill=TRUE,idcol = "file")
r_df
是一个 2 列数据框,包括物种 ID 和具有萼片长度峰值的组内行号。下一步是确定萼片宽度的最大值和最小值。
iris2<-iris2 %>% group_by(Species) %>% mutate(max_sep=max(iris2$Sepal.Width))
iris2<-iris2 %>% group_by(Species) %>% mutate(min_sep=min(iris2$Sepal.Width))
然而,我没有设法做的是检查最大和最小萼片宽度是否在峰值的 5 行之内。例如:对于物种 1,max_sep = 4.4,在第 16 行。查看函数 findpeaks
ealrier 的结果,看起来索引是 TRUE,因为它接近峰值(正好在实际上是峰值)。
[![max_sep 的例子][1]][1]
自从我更熟悉 group_by
以来,我一直在尝试使用 dplyr
的解决方案,但我没有取得太大进展。另一个问题是,在嵌套列表和数据框中,行号是指组内行号而不是总数。我尝试过的解决方案示例:
r_df <- r_df %>% group_by(file) %>% mutate(frame= case_when(nrow(iris2)== r_df$X..i.. & file== id ~ iris2$max_sep))
这给出了错误:
1: In file == id : 较长的对象长度不是较短的倍数 对象长度 2:在 nrow(iris2) == r_df$X..i.. & file == id :更长 对象长度不是较短对象长度的倍数
任何想法将不胜感激!非常感谢 [1]:https://i.stack.imgur.com/s4ces.png
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)