2017-05-15 44 views
1

嗨,不知何故,我的循環不工作。它只需要最後一個變量。下面的代碼:迴路不工作,儲蓄outpout

library(readxl) 
library(readr) 
library(plyr) 
library(dplyr) 

path = "C:/Users/benja/OneDrive/Studium/Bachelorarbeit/Ressourcen/Conference Calls/" 
Enterprise = "ABB Ltd" 

#Import Dictionary 
Dictionary <- read_excel("C:/Users/benja/OneDrive/Studium/Bachelorarbeit/Ressourcen/LoughranMcDonald_MasterDictionary_2014.xlsx", 
        sheet = "Tabelle1") 
for (File in c("2016 Q1.xml","2016 Q2.xml","2016 Q3.xml","2016 Q4.txt")) 
    { 

    #Import Text 
    ABB_2016_Q4 <- read_delim(paste0(path,Enterprise,"/",File), 
         " ", escape_double = FALSE, col_names = FALSE, 
         trim_ws = TRUE) 

    #Umformatierung -> Zuerst Transp, Vektor, kleinbuchstaben, dataframe 
    ABB_2016_Q4 = data.frame(tolower(c(t(ABB_2016_Q4)))) 
    colnames(ABB_2016_Q4) = "Word" 

    #Zusammenführung Text-Dictionary 
    Analyze_2016_Q4 = inner_join(Dictionary,ABB_2016_Q4) 

    #Analyse 
    Rating = sum(Analyze_2016_Q4$Rating) 

} 

如果我嘗試用

print(File) 

它有相應的列表,但迴路不反正工作進行測試。如何在每個循環後保存結果? 我希望顯示不同季度的每個評級。

+0

很難說沒有[最小的可重複的例子(http://stackoverflow.com/questions/5963269/how-to- make-a-great-r-reproducible-example),但它看起來像你的for()循環每次迭代都會覆蓋「Rating」對象。使用'for()'循環來加載文件;將所有其他內容移出 – Phil

+0

我試圖在其中添加示例,但您可以將它想象爲純文本文件,然後將其更改爲單列矢量,然後將內部詞典與詞典連接起來對其進行「評分」。 我試過你的解決方案,但它似乎也覆蓋了數據。 –

回答

0

它看起來像你加載一個'master'文件,然後加載大量單個文件並嘗試將這些文件加入到主文件中。如果是這樣的話,我會採取更具功能性的方法,而不是使用for()循環。

一些示例數據:

master <- data.frame(
    key = letters, 
    stringsAsFactors = FALSE 
)  

a <- data.frame(
    key = sample(letters, 13), 
    dat = sample(1:100, 13), 
    stringsAsFactors = FALSE 
) 

a$key 
letters_reduced <- letters %in% a$key 
letters_reduced <- letters[!letters_reduced] 

b <- data.frame(
    key = sample(letters_reduced, 13), 
    dat = sample(1:100, 13), 
    stringsAsFactors = FALSE 
) 

readr::write_csv(a, "~/StackOverflow/BenjaminBerger/a.csv") 
readr::write_csv(b, "~/StackOverflow/BenjaminBerger/b.csv") 

因此,我們必須在內存中的主對象。將多個文件加載在R,假設他們在同一目錄下,我會使用list.files()然後在文件迭代與lapply()read_csv()

files <- list.files("StackOverflow/BenjaminBerger", pattern = "*.csv", 
        full.names = TRUE) 
df <- lapply(files, readr::read_csv) 

你現在有數據幀的列表。有很多方法可以將它們加入到主對象中,但最簡單的方法是將數據框列表「摺疊」爲一個數據框,然後與其一起加入。這是那麼容易,因爲:

df <- dplyr::bind_rows(df) 
master <- dplyr::inner_join(master, df, by = "key") 

它可以幫助您:

head(master) 
# key dat 
# 1 a 38 
# 2 b 52 
# 3 c 59 
# 4 d 77 
# 5 e 34 
# 6 f 93 
+0

非常感謝您的幫助Phil! 由於Janna的代碼適用於我的問題,所以我不必嘗試另一個,但是非常感謝! –

+0

不用擔心;請確保upvote /接受有用的答案或解決您的問題 – Phil

0

你的循環可能是工作,但目前它沒有返回任何東西:)

例如你可以寫你的結果列表:

#initiate result list 
allResults <- list() 
#populate your filelist; depending on your directory, you can also use list.files() 
files <- c("2016 Q1.xml","2016 Q2.xml","2016 Q3.xml","2016 Q4.txt") 
#iterate through your files 
for (i in (1:length(files)) 
    { #Import Text 
    ABB_2016_Q4 <- read_delim(paste0(path,Enterprise,"/",files[i]), 
         " ", escape_double = FALSE, col_names = FALSE, 
         trim_ws = TRUE) 

    #Umformatierung -> Zuerst Transp, Vektor, kleinbuchstaben, dataframe 
    ABB_2016_Q4 = data.frame(tolower(c(t(ABB_2016_Q4)))) 
    colnames(ABB_2016_Q4) = "Word" 

    #Zusammenführung Text-Dictionary 
    Analyze_2016_Q4 = inner_join(Dictionary,ABB_2016_Q4) 

    #Analyse & store results & add identifier: 
    allResults[[i]] = data.frame(ID = paste0("Q",i), 
           result =sum(Analyze_2016_Q4$Rating), 
           stringsAsFactors = FALSE) 

} 
# flatten resultlist to a dataframe: 
allResultsDf <- do.call(rbind, allResults) 
+0

非常感謝Janna以及它真的很棒! 最後一個小問題跟在列表後面: 如何使用每個結果旁邊的宿舍名稱創建列表? 現在,它的一個空的空間: allResults的4 名單:號碼3 :號碼3 :號碼1 :NUM 9 –

+0

看到編輯:ofcourse,這取決於你的數據文件是否總是以相同的順序爲您的宿舍。例如,如果您想要更安全的選項,則還可以從文件名中提取季度名稱。 –

+0

也可以採取@菲爾的答案,因爲這是一種更普遍的方式來處理你可能做的事情,從長遠來看會節省你的時間(因爲你不必硬編碼所有的文件名,例如) –