2013-12-17 22 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

感谢您的帮助,我同意您的解决方案可行,但我试图尽可能保持代码的简洁,所以在这种情况下更愿意使用正则表达式。 –