我有以下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)
但我无法弄清楚如何在保持索引的同时返回值。
答案 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