用于过滤R数据帧列重复数字的正则表达式

用于过滤R数据帧列重复数字的正则表达式,r,regex,dataframe,filter,R,Regex,Dataframe,Filter,我有一个包含许多列和行的数据框,需要根据两列(Lat和Lon)的值进行过滤。我需要一个正则表达式 删除Lat或Lon列至少没有三位小数的任何行。所以第一行(人类)将被过滤,因为即使Lon有三位小数,Lat也没有 删除小数位数多余的任何行。我所说的冗余是指有三个相同数量的重复,一直持续到最后。但是,如果冗余在第三个小数点后开始,这并不重要。而且,如果冗余最终被一个不同的数字所跟随,那也没关系 Type下面的函数将输出所需的数据帧。它完成了您上面提到的所有要求 check.expressions &

我有一个包含许多列和行的数据框,需要根据两列(Lat和Lon)的值进行过滤。我需要一个正则表达式

  • 删除Lat或Lon列至少没有三位小数的任何行。所以第一行(人类)将被过滤,因为即使Lon有三位小数,Lat也没有
  • 删除小数位数多余的任何行。我所说的冗余是指有三个相同数量的重复,一直持续到最后。但是,如果冗余在第三个小数点后开始,这并不重要。而且,如果冗余最终被一个不同的数字所跟随,那也没关系

  • Type下面的函数将输出所需的数据帧。它完成了您上面提到的所有要求

    check.expressions <- function(data){
      data$pass <- FALSE
      for(i in 1:nrow(data)){
        if(nchar(str_extract(x$Lon[i], "(?<=\\.).*")) < 3 | nchar(str_extract(x$Lat[i], "(?<=\\.).*")) < 3){
         next 
        } else {
          unlist(str_split(str_extract(x$Lon[i], "(?<=\\.).*" ), "")) -> lon
          unlist(str_split(str_extract(x$Lat[i], "(?<=\\.).*" ), "")) -> lat
          if(lon[1] == lon[2] && lon[2] == lon[3]){
            if(length(lon) > 3){
              if(lon[3] != lon[length(lon)]){
                data$pass[i] <- TRUE
                next
              } else {
                next
              }
            }
            next
          }
          if(lat[1] == lat[2] && lat[2] == lat[3]){
            if(length(lat) > 3){
              if(lat[3] != lat[length(lat)]){
                data$pass[i] <- TRUE
                next
              } else {
                next
              }
            }
            next
          }
          if(length(lon) > 4){
            if(lon[2] == lon[3] && lon[3] == lon[4]){
              if(lon[4] != lon[length(lon)]){
                data$pass[i] <- TRUE
                next
              } else {
                next
              }
            }
          }
          if(length(lat) > 4){
            if(lat[2] == lat[3] && lat[3] == lat[4]){
              if(lat[4] != lat[length(lat)]){
                data$pass[i] <- TRUE
                next
              }
            }
          }
          data$pass[i] <- TRUE
        }
      }
      data[data$pass == TRUE, ] -> data
      return(data)
    }
    
    这将产生:

    > check.expressions(x) -> x.out
    > x.out
        Type       Lat      Lon pass
    4 museum 34.666582 9.888064 TRUE
    6   gbif 34.586666 9.318888 TRUE
    

    您已将
    lat
    lon
    存储为数字。如果在所有这些情况下,存储为
    34.660
    34.600
    34.000
    的某些lat/lon会自动截断额外的0,该怎么办。在所有这些情况下,您是要保留这些还是要过滤掉?
    34.660
    应通过此正则表达式。如果Lat和Lon列都有尾随零(并且仅适用于数字
    0
    ,不适用于其他数字),我们是否可以修改以使
    34.600
    失败?因此,如果Lat是
    34.600
    ,Lon是
    9.300
    ,它应该失败
    34.000
    将失败,因为
    0
    重复三次,并且在三个重复的零之后没有任何内容。1)为什么指定
    34.66
    (第二行Lat)失败?当
    34.66==34.660
    时?为什么假定
    0
    不存在?我想解释的是,只需将
    Lat
    列更改为这一列
    Lat,因为它们是实际的纬度和经度值,
    34.660
    是经度的合法值,这比我获取此数据帧的数据集中的
    34.66
    更准确。因此,如果在小数点后第三位明确表示零,我相信它是一个精确的坐标。我正在过滤掉不准确的坐标。我不相信坐标中有不可能重复的十进制值,或大量重复的零。对于每个Lat/Lon条目,我还需要至少三个明确写入的十进制值。
    check.expressions <- function(data){
      data$pass <- FALSE
      for(i in 1:nrow(data)){
        if(nchar(str_extract(x$Lon[i], "(?<=\\.).*")) < 3 | nchar(str_extract(x$Lat[i], "(?<=\\.).*")) < 3){
         next 
        } else {
          unlist(str_split(str_extract(x$Lon[i], "(?<=\\.).*" ), "")) -> lon
          unlist(str_split(str_extract(x$Lat[i], "(?<=\\.).*" ), "")) -> lat
          if(lon[1] == lon[2] && lon[2] == lon[3]){
            if(length(lon) > 3){
              if(lon[3] != lon[length(lon)]){
                data$pass[i] <- TRUE
                next
              } else {
                next
              }
            }
            next
          }
          if(lat[1] == lat[2] && lat[2] == lat[3]){
            if(length(lat) > 3){
              if(lat[3] != lat[length(lat)]){
                data$pass[i] <- TRUE
                next
              } else {
                next
              }
            }
            next
          }
          if(length(lon) > 4){
            if(lon[2] == lon[3] && lon[3] == lon[4]){
              if(lon[4] != lon[length(lon)]){
                data$pass[i] <- TRUE
                next
              } else {
                next
              }
            }
          }
          if(length(lat) > 4){
            if(lat[2] == lat[3] && lat[3] == lat[4]){
              if(lat[4] != lat[length(lat)]){
                data$pass[i] <- TRUE
                next
              }
            }
          }
          data$pass[i] <- TRUE
        }
      }
      data[data$pass == TRUE, ] -> data
      return(data)
    }
    
    check.expressions(x) -> x.out
    
    > check.expressions(x) -> x.out
    > x.out
        Type       Lat      Lon pass
    4 museum 34.666582 9.888064 TRUE
    6   gbif 34.586666 9.318888 TRUE