首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过父数据和子数据执行搜索

如何通过父数据和子数据执行搜索
EN

Stack Overflow用户
提问于 2019-02-27 12:59:06
回答 1查看 61关注 0票数 1

我有一个关于迭代查找的问题。我试图从一个文本数据库(一个本体)中提取文本,它相互关联,所以当我查找一个单词时,它会给我所有的孩子单词(例如“内窥镜”会给我所有的内窥镜子类型,比如“结肠镜”,“胃镜”等等)。

当我查找单词时,我会得到一个包含所有相关单词的数据。然后,我希望在返回的dataframe中查找所有这些单词,并查看它们的相关子单词等,直到搜索结束。为了提供一个最小的可重复示例,我有三个数据文件,如下所示:第一个dataframe是原始查找查询的返回(查找的方式与此无关,因此不包括此功能细节)。

代码语言:javascript
复制
Numsdf1<-c("C123","C456","C789")
Textdf1<-c("Harry","Bobby","Terry")
df1<-data.frame(Numsdf1,Textdf1,stringsAsFactors=FALSE)

第二个数据是查找字符串"C123"的结果。

代码语言:javascript
复制
NumsC123<-c("Coo","Noo","Too")
TextC123<-c("Tim","Slim","Shim")
C123<-data.frame(NumsC123,TextC123,stringsAsFactors=FALSE)

第三个数据是查找"Coo"的结果。

代码语言:javascript
复制
NumsCoo<-c("S144","S199","S743")
TextCoo<-c("Ellie","Bellie","Tellie")
Coo<-data.frame(NumsCoo,TextCoo,stringsAsFactors=FALSE)

第四种是查找"Noo"的结果。

代码语言:javascript
复制
NumsNoo<-c("GHS","THE","PAA")
TextNoo<-c("Front","Bunt","Shunt")
Noo<-data.frame(NumsNoo,TextNoo,stringsAsFactors=FALSE)

查找"Too"时不返回任何内容

为了简洁起见,我没有把其余的查找工作包括在内。

因此,我希望派生一个函数来搜索每个表,直到它返回一个dataframe,如果返回了一个dataframe,那么这个函数将用于搜索。一旦搜索的数据文件到达查找项的末尾,那么它应该返回到父表以继续查找。我想存储所有返回的数据格式。

我想这可以通过以下的方法来实现

代码语言:javascript
复制
lapply(df1$Numsdf1,function(x) lookup(x))

其中,查找获取数据并存储结果。问题是,这对于一个级别的查找是有效的,但是如何将查找和存储应用到后续的子表(可以是比这里显示的更多的层)。

上面的例子的结果应该是:

最后数据:

代码语言:javascript
复制
NumsFinal<-c("C123","C456","C789","Coo","Noo","Too","S144","S199","S743","GHS","THE","PAA"
TextFinal<-c("Harry","Bobby","Terry","Tim","Slim","Shim","Ellie","Bellie","Tellie","Front","Bunt","Shunt"

我猜这只是所有行的累赘。我面临的问题是如何使用查找函数应用lapply,确保查找是通过父表和子表递归完成的,以及如何确保在完成子查找时(在其子表离开的地方)重新启动父表中的查找(即Num列中的所有字符串都已被查找)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-27 14:38:36

这听起来像是递归问题。您可以查看数据框架中第一列的所有元素。如果您发现与此名称匹配(即在全局环境中有一个具有此名称的数据框架),则可以使用这个新的数据框架回忆函数,然后递归再次开始。如果找不到数据框架,只需返回数据帧。

注意,最后的输出将是一个嵌套列表,一些数据帧不止一次出现。您可以使用unlistdo.call(rbind,..)unique的组合来获得最终结果。

编辑:稍微修改了代码,以便从调用中获得更方便的数据结构。

代码语言:javascript
复制
library(tidyverse)
get_all_dfs <- function(df) {
   lapply(df[, 1], function(elem) {
      print(paste("Looking for element", elem))
      # use mget because we can use ifnotfound despite we are requesting only one element
      next_df <- mget(elem, env = .GlobalEnv, ifnotfound = NA)
      if (!is.na(next_df)) {
         unlist(get_all_dfs(next_df[[1]]), F)
      } else {
         list(setNames(df, c("col1", "col2")))
      }
    })
}

flatten_dfr(get_all_dfs(df1)) %>% unique()

所以搜索路径将是C123 -> Coo -> S144 -> S199 -> S743 -> Noo -> GHS -> THE -> PAA -> Too -> C456 -> C789

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54906090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档