2015-05-16 32 views
1

我有一个大的数据列表。我想根据某种模式识别进行编辑。 例如:如果字符串符合一个模式,然后编辑R

如果我有一封信,那么我想打印该字母和一些其他字符后。

如果我有一些数字,我想打印数字和一些额外的字符后。

如果我有一个像“@”“#”“/”和/或“:”这样的独特字符,那么我想用一个空格来替代它。

如果我有n(n是9的数字)数字,那么n(n是一个数字)的字符,那么我想打印我的东西,并在字符串的末尾添加一些字母或字符。

So let a data set be 
data output 
F  F State 
M  M State 
R  R State 
55  55 Object 
53  53 Object 
[email protected] 99M L Object 
93283M 93283M State0 

我认为这将是类似于ifelse(如果有5个号码,随后1个字母,原始空间State0,NA)

我也想了NA,所以这样我可以看到我的数据与我制定的规则不符。

这是我第一次工作,我正在研究,但大多数资源不适用于R. 任何额外的帮助是伟大的!

+0

尝试'sub'或'gsub' – Frank

+0

你粘贴 “国家” 和 “对象” 随机? 'gsub('(\\ d +)(。*)','\\ 1 \\ 2',gsub('[@#/:]','',粘贴(dd $ data,'State')), perl = TRUE) ' – rawr

+0

没有状态和对象对应于某些字母和数字格式组合。 –

回答

4

您可以使用下面的函数greplgsub

test<-function(str){ 
    if(grepl("^[A-Z]$", str, perl=TRUE)){ 
     gsub("^([A-Z])$", "\\1 State", str) 
    } 
    else if(grepl("^\\d+$", str, perl=TRUE)){ 
     gsub("^(\\d+)$", "\\1 Object", str) 
    } 
    else if(grepl("[@#/:]", str, perl=TRUE)){ 
     str<-gsub("[@#/:]", " ", str) 
     paste(str," Object") 
    } 
    else if(grepl("^\\d+[A-Z]+$", str, perl=TRUE)){ 
     gsub("^(\\d+[A-Z]+)$", "\\1 State0", str) 
    } 
} 

x<-"F" 
x<-test(x) 
print(x)  //output: "F State" 

x<-"55" 
x<-test(x) 
print(x)  //output: "55 Object" 

x<-"[email protected]" 
x<-test(x) 
print(x)  //output: "993M L Object" 

x<-"93283M" 
x<-test(x) 
print(x)  //output: "93283M State0" 
+0

这看起来像我可以使用的东西。另外如果字符串不符合上述任何规则,我该如何添加输出NA?如何在寻找信件之前告诉它寻找一定数量的号码? –

+0

我也想在一个大的值列表上使用这个公式,但是当使用X < - “df $ V1”时,它将打印NULL。 –

+0

@user_n在末尾添加另一行,表示“else NA”。要使用一个大的列表,你可以矢量化这个函数或者使用函数'Vectorize':'v < - Vectorize(test); v(c('F','55','993M @ L','9328M'))' – rawr

相关问题