我有一个关于迭代查找的问题。我试图从一个文本数据库(一个本体)中提取文本,它相互关联,所以当我查找一个单词时,它会给我所有的孩子单词(例如“内窥镜”会给我所有的内窥镜子类型,比如“结肠镜”,“胃镜”等等)。
当我查找单词时,我会得到一个包含所有相关单词的数据。然后,我希望在返回的dataframe中查找所有这些单词,并查看它们的相关子单词等,直到搜索结束。为了提供一个最小的可重复示例,我有三个数据文件,如下所示:第一个dataframe是原始查找查询的返回(查找的方式与此无关,因此不包括此功能细节)。
Numsdf1<-c("C123","C456","C789")
Textdf1<-c("Harry","Bobby","Terry")
df1<-data.frame(Numsdf1,Textdf1,stringsAsFactors=FALSE)第二个数据是查找字符串"C123"的结果。
NumsC123<-c("Coo","Noo","Too")
TextC123<-c("Tim","Slim","Shim")
C123<-data.frame(NumsC123,TextC123,stringsAsFactors=FALSE)第三个数据是查找"Coo"的结果。
NumsCoo<-c("S144","S199","S743")
TextCoo<-c("Ellie","Bellie","Tellie")
Coo<-data.frame(NumsCoo,TextCoo,stringsAsFactors=FALSE)第四种是查找"Noo"的结果。
NumsNoo<-c("GHS","THE","PAA")
TextNoo<-c("Front","Bunt","Shunt")
Noo<-data.frame(NumsNoo,TextNoo,stringsAsFactors=FALSE)查找"Too"时不返回任何内容
为了简洁起见,我没有把其余的查找工作包括在内。
因此,我希望派生一个函数来搜索每个表,直到它返回一个dataframe,如果返回了一个dataframe,那么这个函数将用于搜索。一旦搜索的数据文件到达查找项的末尾,那么它应该返回到父表以继续查找。我想存储所有返回的数据格式。
我想这可以通过以下的方法来实现
lapply(df1$Numsdf1,function(x) lookup(x))其中,查找获取数据并存储结果。问题是,这对于一个级别的查找是有效的,但是如何将查找和存储应用到后续的子表(可以是比这里显示的更多的层)。
上面的例子的结果应该是:
最后数据:
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列中的所有字符串都已被查找)。
发布于 2019-02-27 14:38:36
这听起来像是递归问题。您可以查看数据框架中第一列的所有元素。如果您发现与此名称匹配(即在全局环境中有一个具有此名称的数据框架),则可以使用这个新的数据框架回忆函数,然后递归再次开始。如果找不到数据框架,只需返回数据帧。
注意,最后的输出将是一个嵌套列表,一些数据帧不止一次出现。您可以使用unlist、do.call(rbind,..)和unique的组合来获得最终结果。
编辑:稍微修改了代码,以便从调用中获得更方便的数据结构。
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
https://stackoverflow.com/questions/54906090
复制相似问题