转换指数字符串

时间:2015-04-17 11:13:33

标签: r string type-conversion

我正在尝试根据相邻列的值在新列中指定名称。  我正在使用一个采用模式并将其替换为另一个模式的函数:

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中。然而,&#34; 1.00E + 02&#34;不会在df $ y中给出P3,而是复制1.00E + 02。

我是否遗漏了有关指数以及如何将其视为模式的内容?

以下是我的数据表示例,其中df $ x是ID,df $ y是名称:

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

任何帮助将不胜感激。  谢谢MF

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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
    }