2016-08-30 48 views
0

作爲R noob,我目前很可能被一個相當無足輕重的問題困擾着。我的數據看起來像下面的第二張圖片,基本上是一行長度爲三列的行。我需要的是一種掃描工作表的方法,用於查找第一列和第二列中的特定值組合 - 在第二個電子表格中指定的組合(請參見圖1)。當找到特定的組合時,我需要腳本從數據文件中提取有問題的整行。使用R在Excel電子表格中搜索目標使用R

到目前爲止,我已經成功地讀取這些文件沒有問題:

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表可用herehere

+0

如果您提供了一個簡短的真實數據樣本,查看它會容易得多。鏈接到一個簡短的Excel表會做。 –

+0

看着它,我認爲用data.frame代替列表 –

+0

@ R.S將會非常容易。當我回到電腦上的時候,我會試着上傳一個電子表格,但如果你對如何簡化這個過程有任何建議,我都會接受。 – user3010126

回答

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上()

+0

我會在早上給出這個鏡頭,但我想要的是使用目標文件中相鄰單元格中值的組合來查找數據文件中的特定行。然後複製這些行,將它們輸出到不同的電子表格,但我還沒有到處理最後一點。 – user3010126

+0

謝謝@R.S。!它看起來像合併真正做我需要它,我可以輸出目標行到一個新的文件。現在我試圖做相反的事情,即將非目標行提取到新的數據框。我試着玩弄「全部」的說法,但我似乎得到了相同的輸出。 – user3010126

+0

沒關係,我已經想通了方法:)再次感謝! – user3010126

0

(發佈代表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)