R:使用嵌套列表中的索引从数据框中选择行

问题描述

我正在尝试围绕另一个变量的峰值探索分组数据集中的 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 (将#修改为@)