使用R在Excel电子表格中搜索目标



作为一个R新手,我目前被一个可能相当微不足道的问题难住了。我有如下面的第二张图所示的数据,本质上是一长列表,其中有三列的值。我需要的是一种扫描工作表的方法,寻找第一列和第二列中值的特定组合-在第二个目标电子表格中指定的组合(见图1)。当找到该特定组合时,我需要脚本从数据文件中提取有问题的整行。

到目前为止,我已经成功地读取了文件,没有问题:

library(xlsx)
folder <- 'C:\Users\...\Desktop\R EXCEL test\'
target_file <- paste(folder,(readline(prompt = "Enter filename for target list:")),sep = "")
data_file <- paste(folder,(readline(prompt = "Enter data file:")),sep = "")
targetsDb <- read.xlsx(target_file, sheetName = "Sheet1")
data <- read.xlsx(data_file, sheetName = "Sheet1")
targets <- vector(mode = "list", length = 3)
for(i in 1:nrow(targetsDb)){
  targets[[i]] <- c(targetsDb[i,1],targetsDb[i,2])
}

使用最后一个命令,我已经成功地将目标组合保存为列表中的项目。但是,在遍历文件查找前两列中单元格值的任何这些组合时,我遇到了麻烦。我的方法是创建一个包含一个项目的列表,

SID_IA <- vector(mode = "list", length = 1)

,并为数据文件的每一行迭代地填充第1列和第2列的值:

for(n in 1:nrow(data)){
  SID_IA[[n]] <- c(data[n,1],data[n,2])
然后,我将在这里嵌套另一个for循环,它基本上遍历目标表中的每一行,以检查当前SID_IA列表中的值组合是否与任何目标值匹配。然后在循环结束时,清空列表,以便用以下数据值的组合填充。
  for(i in targets){
    if(SID_IA[[n]] %in% targets){
      print(SID_IA[[n]], "in sentence" , data[n,1], "is ", data[n,3])
    }else{
      print(FALSE)
    }
    SID_IA[[n]] <- NULL  
  }
}

但是,如果我尝试运行最后一个循环,它将返回以下输出和错误:

[1] FALSE
Error in SID_IA[[n]] : subscript out of bounds
In addition: Warning message:
In if (SID_IA[[n]] %in% targets) { :
  the condition has length > 1 and only the first element will be used

所以,它似乎至少在一次迭代中做了一些事情,但随后崩溃了。我肯定我漏掉了一些很基本的东西,但我就是看不出来。什么好主意吗?

编辑:根据要求,我已经删除了图像,并在这里和这里提供了测试Excel表格。

OK..我正在尝试一个答案,应该不需要使用花哨的技巧。

data<- xlsx::read.xlsx(file = "Data.xlsx",sheetIndex = 1)
target<-  xlsx::read.xlsx(file = "Targets.xlsx",sheetIndex = 1)
head(data)
target

这些值已经是data.frame格式了。如果您只想知道哪些行在数据和目标中看起来完全相同,那么查找merge

就很简单了。
merge(target,data,all = F)

另一方面,如果您希望保留带有目标行标记的数据表,那么最简单的方法是创建一个索引列

data$indx<- 1:nrow(data)
data
mrg<- merge(target,data,all = F)
data$test<- rep("test", nrow(data))
data$test[mrg$indx]<- "target"
data

这和你发的原图很像。

顺便说一句,如果你是在图形界面上,你也可以使用文件对话框打开数据文件。Check out file.choose()

(代表OP发布)

来自@ r.s.。不涉及向量和循环的建议,经过一些尝试,我已经弄清楚如何提取目标线,然后如何从原始数据中删除它们,输出两个结果。我把它留在这里供将来参考,并认为这个问题已经解决了。

extracted <- merge(targets,data,all = F)
write.xlsx(extracted,output_file1)
combined <-rbind(data,extracted)
minus.target <- combined[!duplicated(combined,fromLast = FALSE)&!duplicated(combined,fromLast = TRUE),]
write.xls(minus.target,output_file2)

最新更新