2013-12-17 23 views
2

在R中同時使用正則表達式時,是否可以聚合或使用子集?R正則表達式和聚合/子集

我試圖解決的問題是這樣的:我有一個數據幀稱爲「wpbCellFeatures」多列,包括一個唯一的標識符「rowColFoVCell」:

rowColFoVCell wpbCount meanFeret meanPerim meanCirc meanAR meanRound meanSolidity 
1 001001001001  38 1.182632 3.047368 0.7560526 1.948947 0.6036842 0.8289474 
2 001001001002  8 1.886250 4.493750 0.7537500 2.365000 0.5350000 0.8325000 

此列包含數字「001001001001」,「 001001001002','001001001003',...,'001003004002'等等。形成這個ID的數字對應於行號,列號,視野和單元號,所以例如'001003004002'是第一行,第三列,第四個視野和第二個單元格。

我想選擇行數在1到3之間的所有標識符,例如聚合到一個新的數據框中。我怎麼能在R中做到這一點,我認爲這將涉及使用聚合和正則表達式,但我不熟悉這一點?

由於

回答

8

代替具有正則表達式的大驚小怪,我想僅通過使用read.fwf(或substr或相關函數)拆分第一列到相應的列。然後,將它們綁回到原始數據集中,並像平常一樣使用aggregate等等。

toBind <- read.fwf(file = textConnection(as.character(mydf$rowColFoVCell)), 
        widths = c(3, 3, 3, 3), colClasses = "character", 
        col.names = c("Row", "Col", "FoV", "Cell")) 
cbind(toBind, mydf) 
# Row Col FoV Cell rowColFoVCell wpbCount meanFeret meanPerim meanCirc meanAR meanRound 
# 1 001 001 001 001 001001001001  38 1.182632 3.047368 0.7560526 1.948947 0.6036842 
# 2 001 001 001 002 001001001002  8 1.886250 4.493750 0.7537500 2.365000 0.5350000 
# meanSolidity 
# 1 0.8289474 
# 2 0.8325000 

在這裏,我開始與「是myDF」爲:

mydf <- structure(list(rowColFoVCell = c("001001001001", "001001001002"), 
        wpbCount = c(38L, 8L), meanFeret = c(1.182632, 1.88625), 
        meanPerim = c(3.047368, 4.49375), 
        meanCirc = c(0.7560526, 0.75375), 
        meanAR = c(1.948947, 2.365), 
        meanRound = c(0.6036842, 0.535), 
        meanSolidity = c(0.8289474, 0.8325)), 
        .Names = c("rowColFoVCell", "wpbCount", "meanFeret", 
          "meanPerim", "meanCirc", "meanAR", "meanRound", 
          "meanSolidity"), 
        class = "data.frame", row.names = c(NA, -2L)) 
0

經過一番研究,我發現,使用子集和正則表達式是去,而不是總的方法。這是我如何解決這個難題:

wpbCellFeaturesControl <- subset(wpbCellFeatures, grepl("^[0-9]{3}(00[1-3])[0-9]{6}", wpbCellFeatures$rowColFoVCell)) 

grepl在rowColFoVCell列引號內的模式相匹配,
^表示要搜索字符串的開頭開始
[0-9]{3}數字0到9的3倍
(00[1-3])搜索模式001002,並且003
[0-9]{6}數字0到9分六次

+2

我仍然認爲這是矯枉過正,如果你的專欄確實是固定的寬度,它是。從長遠來看,你最好還是將這些信息作爲單獨的專欄。如有必要,可以將以後的獨立列粘貼在一起。 – A5C1D2H2I1M1N2O1R2T1

+0

感謝您的幫助,我同意您的解決方案可行,但我試圖儘可能保持代碼的簡潔,所以在這種情況下更願意使用正則表達式。 –