【问题标题】:R search function to return start and end location [duplicate]R搜索功能返回开始和结束位置[重复]
【发布时间】:2019-05-13 10:02:12
【问题描述】:

我需要编写一个搜索函数来使用 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')

【问题讨论】:

  • search,1 是你要找的?
  • 不,1 是 C2 中的值
  • 对不起,我不明白。你能解释一下search("aa",1) 在做什么吗?从输出来看,它似乎在 C2 中找到 aa==1,不是吗?
  • 抱歉造成混淆。我已经编辑了数据集以便更容易理解。在搜索功能中是我从 C1 和 C2 列输入的 2 个值。我期望的输出将是搜索输入的所有索引位置。希望有助于澄清。谢谢。

标签: r function search minmax


【解决方案1】:

@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的条件,并删除不满足条件的行。

【讨论】:

  • @罗纳克沙阿。非常感谢您的解决方案。我正在尝试删除结果数据帧的排序号(#1、#3、#5)或将其更改为#1、#2、#3。你知道怎么做吗?非常感谢您的帮助。
  • @user247704 当然,我已经更新了答案。请看一看。
  • @罗纳克沙阿。非常感谢您的帮助。我知道这是几行代码;但我就是无法让它工作:(我正在从你的代码中学习。我编辑了我的问题,因为我意识到根据列 C1 给出的条件(即“aa”)需要先完成数据集的一个子集,然后再运行搜索第一个和结束位置。得到的结果是基于子集的索引。所以期望的结果应该是 (#1 (1,3); #2 (5, 8); #3 (10 ,11)相反。我已经编辑了问题。在你的代码中,我添加了一个子集函数;但它不起作用。你能帮忙吗?
  • @user247704 我已经相应地更新了答案。可以查一下吗?
  • 完成,再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
  • 1970-01-01
相关资源
最近更新 更多