2015-04-17 76 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 
    }