从R中的字符数组中提取值

时间:2015-05-12 08:33:38

标签: regex r

我有以下charecter数组

 head(rest, n=20)
      [,1] [,2]   [,3] 
 [1,] ""   ""     ""   
 [2,] ""   ""     ""   
 [3,] "B"  "-1"   "-tv"
 [4,] ""   ""     ""   
 [5,] ""   ""     ""   
 [6,] "A"   ""     ""   
 [7,] ""   ""     ""   
...
[2893,] ""   ""    ""  
[2894,] ""   ""    ""  
[2895,] ""   ""    ""  
[2896,] "st" ""    ""  
[2897,] "2"  "-th" ""  
[2898,] "1"  ""    "" 

我想在保留索引值的同时提取所有大写字母,所有数字和所有小写字母。

我可以用这个

找到所有大写的位置字母
grep("[A-Z]", rest, perl=TRUE)

的值
grep("[A-Z]", rest, perl=TRUE, value=TRUE)

但我无法弄清楚如何在保持索引的同时返回值。

1 个答案:

答案 0 :(得分:1)

我认为这可能是您正在寻找的(使用您的示例数据):

rest <- matrix(c('','','','','','','B','-1','-tv','','','','','','','A','','','','','','','','','','','','','','','st','','','2','-th','','1','',''),13,byrow=T);
pat <- c('[A-Z]','[0-9]','[a-z]');
name <- c('house','floor','side');
res <- setNames(as.data.frame(lapply(pat,function(x) { i <- grep(x,rest); x <- rep('',nrow(rest)); x[(i-1)%%nrow(rest)+1] <- rest[i]; x; }),stringsAsFactors=F),name);
res;
##    house floor side
## 1
## 2
## 3      B    -1  -tv
## 4
## 5
## 6      A
## 7
## 8
## 9
## 10
## 11               st
## 12           2  -th
## 13           1

实际上这不是一个很好的演示,因为缺乏填充的细胞,这里有一些随机数据用于另一个演示:

set.seed(9);
R <- 12;
C <- 3;
N <- 5;
rest <- matrix(sample(c(rstr(N,charset=letters,lmin=1,lmax=3),rstr(N,charset=LETTERS,lmin=1,lmax=3),rstr(N,charset=0:9,lmin=1,lmax=3),rep('',R*C-N*3))),R);
rest;
##       [,1]  [,2] [,3]
##  [1,] "AN"  ""   ""
##  [2,] "895" ""   ""
##  [3,] "698" ""   ""
##  [4,] "zd"  ""   "32"
##  [5,] ""    ""   ""
##  [6,] "CK"  ""   ""
##  [7,] ""    ""   ""
##  [8,] "JWZ" ""   "r"
##  [9,] "1"   "j"  "IX"
## [10,] ""    ""   "ZFM"
## [11,] "k"   "d"  ""
## [12,] ""    ""   "252"
pat <- c('[A-Z]','[0-9]','[a-z]');
name <- c('house','floor','side');
res <- setNames(as.data.frame(lapply(pat,function(x) { i <- grep(x,rest); x <- rep('',R); x[(i-1)%%R+1] <- rest[i]; x; }),stringsAsFactors=F),name);
res;
##    house floor side
## 1     AN
## 2          895
## 3          698
## 4           32   zd
## 5
## 6     CK
## 7
## 8    JWZ          r
## 9     IX     1    j
## 10   ZFM
## 11                d
## 12         252

请注意,我使用了一个名为rstr()的函数来生成随机字符串值。它与这个问题无关,所以我没有发布它,但是如果你愿意,我也可以在这个答案中提供它。

第11行偶然发现两个side值之间存在冲突。您在注释中指定这不会发生在您的实际数据中,但您可以从输出中看到代码正常处理该情况;它最终保持行中最右边的值。

单字母小写字符串从第三列移动到第一列的新要求,与第一列中的任何现有值连接,都可以满足(继续我的第二个演示):

res$house <- ifelse(nchar(res$side)==1,paste0(res$house,res$side),res$house);
res$side <- ifelse(nchar(res$side)==1,'',res$side);
res;
##    house floor side
## 1     AN
## 2          895
## 3          698
## 4           32   zd
## 5
## 6     CK
## 7
## 8   JWZr
## 9    IXj     1
## 10   ZFM
## 11     d
## 12         252