2015-04-17 65 views
0

我想根据相邻列的值在新列中指定名称。 我使用一个函数,它接受一个模式并用另一个替换它:转换指数字符串

sub<-function(pattern, replacement, x, ...) { 
    result <- x 
    for (i in 1:length(pattern)) { 
    result <- gsub(pattern[i], replacement[i], result, ...) 
    } 
    result 
} 

我可以采取如下:

df$x<-as.character(df$x) 

df$y<-(sub(c("1A1","1B2", "1.00E+01"), 
      c("P1", "P2", "P3"), df$x)) 

因此,DF $ Y将现在包含P1,P2,其中1A1, 1B2以df $ x的形式出现。然而,“1.00E + 02”在df $ y中不给P3,1.00E + 02被复制到它。

我错过了一些关于指数以及它们如何被读作模式的东西?

这里是我的数据表的例子,其中DF $ x是ID和df $ y是名称:

Name  ID 
p1   1A1 
p2   1B2 
1.00E+01 1.00E+01 

任何帮助,将不胜感激。 由于MF

+0

阅读文档。如果传递一个长度大于1的向量作为'pattern',则只使用其第一个元素。此外,默认情况下,该模式被理解为正则表达式。 – Roland

+0

对不起,如果我错了,但如果模式只识别使用的第一个元素,那么1A1和1B2之间没有区别,但是有。这只是导致问题的1.00E + 01。 – MRF

+0

我无法重现这一点。如果我尝试它,只有第一个元素被更改。 – Roland

回答

1

pattern被解析为默认和.+正则表达式在正则表达式的特殊含义。使用fixed = TRUE

mysub<-function(pattern, replacement, x, ...) { 
    result <- x 
    for (i in 1:length(pattern)) { 
    result <- gsub(pattern[i], replacement[i], result, fixed = TRUE, ...) 
    } 
    result 
} 

x <- c("1A1", "1B2", "1.00E+01") 
mysub(c("1A1","1B2", "1.00E+01"), 
    c("P1", "P2", "P3"), x) 
#[1] "P1" "P2" "P3" 

我更喜欢使用factor此:

as.character(factor(x, 
        levels = c("1A1","1B2", "1.00E+01"), 
        labels = c("P1", "P2", "P3"))) 
#[1] "P1" "P2" "P3" 
+0

嗨,罗兰,是的,它肯定是+符号弄乱1.00E + 0X值。如果有任何兴趣,我发现了以下解决方法。 (i in 1:length(pattern)){ result [x(x)) 结果[-i(1) == pattern [i]] < - replacement [i] } result }' – MRF

0

@Roland,是的它肯定+符号,其搞砸1.00E + 0X值。如果有任何兴趣,我发现了以下解决方法。

mysub2 <-function(pattern, replacement, x, ...) { 
    result <- rep("", length(x)) 
     for (i in 1:length(pattern)){ 
     result[x==pattern[i]]<-replacement[i] 
    } 
     result 
    }