2013-08-16 20 views
0

我有一個數據框,其中包含一個文件名與常規部分。我使用正則表達式來解析這個文件名並將每個部分存儲在它自己的列中。開箱清單作爲數據框列清單

parse.file.name <- function(file.name="cc-nolabel-AEMNZ334_0009-loc-1317-407-6-39.png") 
{ 

rfn <- regexec(pattern="cc-(.+?)-(.+?)-loc-(.+?)-(.+?)-(.+?)-(.+?)\\.png", text=file.name) 
matchfn <- regmatches(file.name, rfn) 
return(matchfn) 
} 

basic.features$parsed.filename <- parse.file.name(as.character(basic.features$filename)) 

filename包含類似的默認參數值。我檢索了單個值,查找類似下面的每一列:

basic.features$label <- unlist(lapply(basic.features$parsed.filename, 
             function(pf) { 
             return(unlist(pf)[2]) })) 

我覺得這不是一個優雅的方式,但不能設法從包含每一行列表中的數據幀列中獲取單個值容易。有一個更好的方法嗎?

如果你喜歡示例數據:

basic.features <- data.frame(filename=c("cc-nolabel-AEMNZ336_0009-loc-1003-1504-7-8.png", "cc-nolabel-AEMNZ335_0006-loc-1979-880-13-10.png", "cc-nolabel-AEMNZ333_0007-loc-941-263-8-8.png", "cc-nolabel-AEMNZ336_0014-loc-2011-24-4-4.png", "cc-nolabel-AEMNZ335_0013-loc-2087-644-66-41.png", "cc-nolabel-AEMNZ333_0013-loc-1531-374-12-23.png")) 

回答

2

如果使用sapply所以,很簡單:

basic.features$label <- sapply(basic.features$parsed.filename,function(x){x[2]}) 

但是,如果你想將你的解析值到一個data.frame一個炮打響,你可以這樣做:

DF <- data.frame(t(sapply(basic.features$parsed.filename,function(x){x}))) 
colnames(DF) <- c('filename','label','code1','code2','code3','code4','code5') 

> DF 
             filename label   code1 code2 code3 code4 code5 
1 cc-nolabel-AEMNZ336_0009-loc-1003-1504-7-8.png nolabel AEMNZ336_0009 1003 1504  7  8 
2 cc-nolabel-AEMNZ335_0006-loc-1979-880-13-10.png nolabel AEMNZ335_0006 1979 880 13 10 
3 cc-nolabel-AEMNZ333_0007-loc-941-263-8-8.png nolabel AEMNZ333_0007 941 263  8  8 
4 cc-nolabel-AEMNZ336_0014-loc-2011-24-4-4.png nolabel AEMNZ336_0014 2011 24  4  4 
5 cc-nolabel-AEMNZ335_0013-loc-2087-644-66-41.png nolabel AEMNZ335_0013 2087 644 66 41 
6 cc-nolabel-AEMNZ333_0013-loc-1531-374-12-23.png nolabel AEMNZ333_0013 1531 374 12 23 
1

我建議分三步做。

  1. 轉換您的載體列表矩陣按行結合他們:

    mat <- do.call(rbind, basic.features$parsed.filename) 
    
  2. 接下來,轉換成數據幀

    df <- as.data.frame(mat, stringsAsFactors = FALSE) 
    
  3. 最後,字符轉換爲列正確的類型和名稱列

    df[] <- lapply(df, type.convert, as.is = TRUE) 
    names(df) <- c('filename', 'label', 'code1', 'code2', 'code3', 'code4', 'code5') 
    
+0

太糟糕了我只能選擇一個答案。謝謝。 –