首页 > 解决方案 > R搜索功能返回开始和结束位置

问题描述

我需要编写一个搜索函数来使用 R 在大型数据集中查找某些元素的开始和结束位置。

我的示例数据集如下所示:

C1   C2  Index
aa   J    1   
aa   J    2
aa   J    3
ab   O    4
aa   O    5
aa   J    6
aa   J    7
aa   J    8
aa   J    9
aa   K    10
ac   K    11
aa   J    12
aa   J    13

我想编写一个搜索函数,例如search("aa","J")(其中“aa”是 C1 列的值,“J”是 C2 列的值)。该函数将首先根据“aa”对数据集进行子集化;然后根据这个子集提供索引。

结果将返回在矩阵中找到的所有位置的索引,如下所示:

        [,1]   [,2]
[1,]     1      3
[2,]     5      8
[3,]     10     11

非常感谢你。

我试图修改提供的代码;但有错误。你能帮忙看看吗?

get_inds <- function(test, C1, C2) {
   test <- subset(test, test$C1 == C1)
   inds <- rle(test$C1 == C1 & test$C2 == C2)
   end = cumsum(inds$lengths)
   start = c(1, head(end, -1) + 1)
   data.frame(start, end)[inds$values, ]
}

get_inds(test, 'aa', 'J')

标签: rfunctionsearchminmax

解决方案


@markus 提供的链接解决了您的问题,您需要根据您的要求进行修改。

get_inds <- function(test, a, b) {
   test <- subset(test, C1 == a)
   inds <- rle(test$C1 == a & test$C2 == b)
   end = cumsum(inds$lengths)
   start = c(1, head(end, -1) + 1)
   df = data.frame(start, end)[inds$values, ]
   row.names(df) <- NULL
   df
} 

get_inds(test, 'aa', 'J')

#  start end
#1     1   3
#2     5   8
#3    10  11

您需要更改条件rle并删除不满足条件的行。


推荐阅读