2016-06-30 51 views
0
setwd("C:\\Users\\DATA") 
    temp = list.files(pattern="*.dta") 
    for (i in 1:length(temp)) assign(temp[i], read.dta13(temp[i], nonint.factors = TRUE)) 
    grep(pattern="_m", temp, value=TRUE) 

這裏我創建一個我的數據集列表並將它們讀入R,然後嘗試使用grep爲了找到模式爲_m的所有變量名,顯然這不起作用,因爲這只是返回所有帶有模式的文件名_M。所以基本上我想要的是我的代碼循環遍歷數據庫列表,找到以_m結尾的變量,並返回包含這些變量的數據庫列表。如何在數據集列表中查找公共變量並在R中對其進行重新整形?

現在,我不是很確定如何做到這一點,我是很新的編碼和R.

除了需要知道在哪個數據庫這些變量,我還需要能夠做出改變(重塑他們)這些變量。

回答

0

首先,assign將無法​​正常工作,因爲它需要一個字符串(或字符,因爲他們是所謂的R)。它將使用第一個元素作爲變量(有關更多信息,請參閱here)。

你能做什麼取決於你的數據結構。 read.dta13會將每個文件加載爲data.frame。

如果你尋找列名,你可以做這樣的事情:

myList <- character() 
for (i in 1:length(temp)) { 

    # save the content of your file in a data frame 
    df <- read.dta13(temp[i], nonint.factors = TRUE)) 

    # identify the names of the columns matching your pattern 
    varMatch <- grep(pattern="_m", colnames(df), value=TRUE) 

    # check if at least one of the columns match the pattern 
    if (length(varMatch)) { 
     myList <- c(myList, temp[i]) # save the name if match 
    } 

} 

如果你找一個列的內容,你可以看看dplyr包,這是在非常有用涉及到數據幀操縱。

dplyr的一個很好的介紹可以在包裝圖案here中找到。

請注意,在R中,追加到矢量可能會變得非常緩慢(有關更多詳細信息,請參閱此SO question)。

+0

謝謝回答!但實際上,我怎麼查看我們保存的名稱列表?現在,它似乎是在「價值」下面的數據我的全球環境標籤。 – Floris

+0

你是對的,名稱是矢量myList中。你可以ACCES s時,如你所願,但在提示符下鍵入myList中會顯示其在控制檯中的內容。 – paulwasit

+0

好吧,這個工程,現在我得到了包含我需要的變量的數據集列表。現在,如果從這個新列表中,我想從每個數據集中提取名爲'a','b'或包含模式「_m」的所有列並將它們放入新數據集中? – Floris

0

這裏是要弄清楚哪些文件具有與「_M」結尾的名稱變量的一種方法:

# setup 
setwd("C:\\Users\\DATA") 
temp = list.files(pattern="*.dta") 
# logical vector to be filled in 
inFileVec <- logical(length(temp)) 

# loop through each file 
for (i in 1:length(temp)) { 
    # read file 
    fileTemp <- read.dta13(temp[i], nonint.factors = TRUE) 

    # fill in vector with TRUE if any variable ends in "_m" 
    inFileVec[i] <- any(grepl("_m$", names(fileTemp))) 
} 

在最後一行,names返回變量名,grepl返回一個邏輯向量是否每個變量名稱與模式匹配,並且any返回長度爲1的邏輯向量,指示是否從grepl返回了至少一個TRUE。你認爲

# print out these file names  
temp[inFileVec] 
+0

謝謝回答!最後一行'temp [inFileVec]'只是將'character(0)'表示爲輸出,這是什麼意思? – Floris

+0

嘗試打印出循環中列的名稱:'cat(names(fileTemp))'。 – lmo

+0

嗯,它提供了一堆的變量名,但他們都不符合「_M'模式奇怪的。所以沒有變量名 – Floris

相關問題