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