作为一个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
所以,它似乎至少在一次迭代中做了一些事情,但随后崩溃了。我确定我错过了一些非常基本的东西,但我无法看到它。有什么想法吗?
答案 0 :(得分:0)
好的..我尝试的答案应该最少使用花哨的技巧。
data<- xlsx::read.xlsx(file = "Data.xlsx",sheetIndex = 1)
target<- xlsx::read.xlsx(file = "Targets.xlsx",sheetIndex = 1)
head(data)
target
这些值已经是data.frame格式。如果您只想知道哪些行在数据和目标中显示完全相同,那么它就像查找合并一样简单
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
这就像您发布的原始图片一样。
顺便说一句,如果您在图形界面上,您也可以使用文件对话框打开数据文件..查看file.choose()
答案 1 :(得分:0)
(代表OP发布)。
根据@ RS的建议,没有涉及向量和循环,经过一些游戏,我已经想出如何提取目标线,然后如何从原始线中删除它们数据,输出两个结果。我将它留在这里供将来参考,并考虑到这一点已经解决了。
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)