【问题标题】:Converting a exponential a string将指数转换为字符串
【发布时间】:2015-06-24 05:06:37
【问题描述】:

我正在尝试根据相邻列的值在新列中分配名称。 我正在使用一个函数,它接受一个模式并将其替换为另一个:

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,其中 df$x 中存在 1A1、1B2。但是,“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

【问题讨论】:

  • 阅读文档。如果将长度 > 1 的向量作为pattern 传递,则仅使用其第一个元素。此外,默认情况下,模式被理解为正则表达式。
  • 对不起,如果我错了,但如果模式只识别使用的第一个元素,那么 1A1 和 1B2 之间就没有区别,但是有。只有 1.00E+01 会导致问题。
  • 我无法重现这个。如果我尝试,只会更改第一个元素。
  • 这很奇怪。如果我从这里复制并运行函数 sub,则使用的字符串不是第一个元素。
  • 哦,对不起。我没有看到你定义了一个函数sub。这是个坏主意,因为有一个(密切相关的)基本函数sub

标签: r string type-conversion


【解决方案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"

【讨论】:

  • 嗨 Roland,是的,肯定是 + 符号弄乱了 1.00E+0X 值。如果有任何兴趣,我发现了以下解决方法。 ' mysub2
【解决方案2】:

@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
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 2019-05-09
    • 1970-01-01
    • 2017-09-16
    相关资源
    最近更新 更多