2015-03-08 49 views
1

這個問題涉及R,但本質上並不是語言特定的。我有一堆這種通用格式的csv文件「sitename_03082015.csv」。該文件有5列和各行正則表達式和文件處理

Host MaximumIn MaximumOut AverageIn AverageOut 
device1 30.63 Kbps 0 bps  24.60 Kbps 0 bps 
device2 1.13 Mbps 24.89 Kbps 21.76 Kbps 461 bps 
device5 698.44 Kbps 37.71 Kbps 17.49 Kbps 3.37 Kbps 

我最終要在所有文件的讀取和合並,我可以做的,但在合併過程中我想讀的站點名稱和日期,並把它添加到每個相關的行因此輸出看起來像這樣

Host  MaximumIn  MaximumOut AverageIn AverageOut Site Name Date 
device1 30.63 Kbps 0 bps  24.60 Kbps 0 bps  SiteA  3/7/15 
device12 1.13 Mbps  24.89 Kbps 21.76 Kbps 461 bps  SiteA  3/8/15 
device1 698.44 Kbps 37.71 Kbps 17.49 Kbps 3.37 Kbps SiteB  3/7/15 
device2 39.08 Kbps 1.14 Mbps 10.88 Kbps 27.06 Kbps SiteB  3/8/15 
device3 123.43 Kbps 176.86 Kbps 8.62 Kbps 3.78 Kbps SiteB  3/9/15 

隨着我的R代碼裏面,我可以做到以下幾點:

#Get list of file names 
filenames<- list.files(pattern = ".csv$") 

#This extracts everything up to the underscore to get site name 
siteName <- str_extract(string = filenames, "[^_]*") 

# Extract date from file names use 
date <- str_extract(string = filenames, "\\d{8}") 

隨着下面R代碼裏面我可以合併所有的文件,但是,這將是沒有增加我想要的網站名稱和日期列。

myDF<-do.call("rbind", lapply(filenames, read.table, header=TRUE, sep=",")) 

我只是不能讓我圍繞着如何做網站和日期添加和填充列創建我的理想數據框也就是上面第二個表中提取頭。

我最努力的溶液下面貼:)

回答

2

立即在我腦海中是做cbind在閱讀額外的Infor的信息,並做rbind事後的方式。類似的東西:

myDF<-do.call("rbind", 
      lapply(filenames, 
       function(x) cbind(read.table(x, header=TRUE, sep=","), 
               "Site Name" = str_extract(string = x, "[^_]*"), 
               "Date" = as.Date(str_extract(string = x, "\\d{8}"), "%m%d%Y")))) 
+0

有趣我會玩這個有很多在一行感謝答覆。 – JohnP 2015-03-08 18:55:09

+0

我試着運行你給我的示例代碼,它只是掛起,但它肯定是在他的正確軌道 – JohnP 2015-03-08 19:38:20

+0

感謝您的幫助我得到它的工作你的代碼是正確的,只需要在最後添加一個父母。 – JohnP 2015-03-08 21:19:46

1

我做了類似的事情,可以在這裏應用。您可以添加更多以逗號分隔的文件名。同樣可以提取網站。讓我知道你是否需要更多的幫助。

##Assuming your csv files are saved in location C:/" 
    library(stringr) 

    ##List all filenames 
    fileNames <- c("hist_03082015.csv","hist_03092015.csv") 

    ##Create a empty dataframe to save all output to 
    final_df <- NULL 

    for (i in fileNames) { 
    ##Read CSV 
    df <- read.csv(paste("C:/",i,sep=""),header = TRUE, 
       sep = ",",colClasses='character') 
    ##Extract date from filename into a column 
    df$Date <- gsub("\\D","",i) 
    ##Convert string to date 
    df$Date <-as.Date(paste(str_sub(df$Date, 1, 2), 
       str_sub(df$Date, 3,-5), 
       str_sub(df$Date, 5,-1),sep="-"),"%d-%m-%Y") 
    ##save all data into 1 dataframe 
    final_df <- rbind(final_df,df) 
    print(summary(final_df)) 
    }