• R语言
  • str_replace函数替换data.frame中字母出错

wqssf

感觉提问姿势不错啊,有MRE,删了可惜,是作者自己删的吗?

    tctcab 谢谢回答,那天我提问后没过几分钟,问题就解决了,所以就删掉了。用正则表达式来识别字母和非字母,就解决了。

      yihui 谢谢回答。刚提问没多久,就用正则表达式来搞定了。所以,就删掉了

      wqssf 若不嫌麻烦,可以恢复这个帖子,并把你的解决办法分享在下边,或许对别人有用。

      不过,若是不愿意也没有关系。郭德纲曰:“(这是)自由人自己的意志”。: )

      我试了一下:

      dd=data.frame(num = c("2L","3ND",66))
      dd1 <- separate(dd, num, sep = "[:upper:]", into = c("num", "letter"))
      dd1$num <- as.numeric(dd1$num)
      for (i in 1:length(dd1$num))
      if (is.na(dd1$letter[i])) {
              dd1$num[i] = dd1$num[i] 
      } else {dd1$num[i] = dd1$num[i] / 5}
      dd <- dd1[1]
      dd

      不过我猜应该有更简洁的办法,分享自己的解法或有抛砖引玉的效果,有利于积累经验。

        果然是已经解决了。我猜对了

        Non-Tidyverse 版:

        as.numeric(gsub('[a-zA-Z]+', '', as.character(dd[, 1]))) / ifelse(grepl('[a-zA-Z]+', as.character(dd[, 1])), 5, 1)

        还有就是你的题目描述错了吧?应该是除以 5,不是除以 2?

          恢复只是举手之劳,我看大家回帖都这么热烈,我就把它恢复了

          Liechi 所用方法和您的很接近:

          for(i in 1:nrow(mn)){ 
            for(j in 1:ncol(mn)) {
              if(str_detect(dd[i,j],"[A-Z]")==TRUE)
              {mn[i,j]=str_replace(dd[i,j],"[A-Z]+","") %>% as.numeric()/2} 
              else {mn[i,j]=dd[i,j]%>% as.numeric()}
            }
          }

          dapengde 我的目的是除以2,编码中用不同数字试结果……