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

各位老师,我的数据中某些列含有2L,3ND这种数字和字母的组合,我需要把字母去掉,然后剩下的数字除以2(2L变为2,然后除以2,3ND变为3,然后除以2,不含L或者ND的数字保持不变),但是得到的结果中,含有L的正确了,含有ND和不含字母的部分,完全不对,各位老师对此有什么建议吗?谢谢;代码如下:

library(tidyverse)
dd=as.data.frame(c("2L","3ND",66))
colnames(dd)="vv"
mn=matrix(0,nrow = nrow(dd),ncol = ncol(dd))
for(i in 1:nrow(mn)){ 
  for(j in 1:ncol(mn)) 
    if(str_detect(dd[i,j],"L")==TRUE)
    {mn[i,j]=str_replace(dd[i,j],"L","") %>% as.numeric()/5} 
  else if(str_detect(dd[i,j],"L")==F)
  {mn[i,j]=dd[i,j]}
  else if(str_detect(dd[i,j],"ND")==TRUE)
  {mn[i,j]=str_replace(dd[i,j],"ND","") %>% as.numeric()/5} 
  else if(str_detect(dd[i,j],"ND")==F)
  {mn[i,j]=dd[i,j]}
}
rs=as.data.frame(mn)


###,下面的2.0应为0.6,3.0应为66
> rs
   V1
1 0.4
2 2.0
3 3.0

    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,编码中用不同数字试结果……