Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当整行值与正则表达式或一组值匹配时,删除data.frame中的行_R - Fatal编程技术网

当整行值与正则表达式或一组值匹配时,删除data.frame中的行

当整行值与正则表达式或一组值匹配时,删除data.frame中的行,r,R,我有一个这样的数据框(正确的值​​这只是一个例子): 导致错误的结果: a b c d e 3 4 7 3 3 3 NO_DATA 这就是我想要的结果: a b c d e 6 <NA> 2 2 2 2 7 3 3

我有一个这样的数据框(正确的值​​这只是一个例子):

导致错误的结果:

    a b c d       e
3                  
4                  
7   3   3 3 NO_DATA
这就是我想要的结果:

     a       b       c       d       e   
6    <NA>       2       2       2       2  
7       3               3       3 NO_DATA 
abcde
6           2       2       2       2  
7 3无数据

我想使用正则表达式,因为可能的值可能会有所不同,这里有一种方法可以删除使用正则表达式(即,
grepl()
)和
is.na()
来识别
na

首先使用
rappy()
创建一个
TRUE
/
FALSE
数据帧进行过滤。然后有两种方法可以从那里过滤。请注意,如果使用
rowMeans()
拥有非常大的数据帧,则会将其强制转换为一个矩阵(因此这可能会很慢)。通常不是一个问题,而是一个重要的警告。希望这有帮助

# Replace each cell with T/F based on the function (grepl() / is.na())
idx_df <- rapply(df, function(x) grepl("^(\\s*|NO_DATA)$", x) | is.na(x), how = "replace")

# Check if there were no matches in the function (i.e., there is at least one FALSE)
idx <- do.call(pmin, idx_df) == 0

# Check is the rowMean is less than 1 (not all TRUE)
idx2 <- rowMeans(idx_df) < 1

identical(idx, idx2) # same result
[1] TRUE

df[idx, ]
     a b c d       e
6 <NA> 2 2 2       2
7    3   3 3 NO_DATA
#根据函数(grepl()/is.na())用T/F替换每个单元格

idx_df这里是一种使用regex(即
grepl()
)和
is.na()
来识别
na
值的删除方法

首先使用
rappy()
创建一个
TRUE
/
FALSE
数据帧进行过滤。然后有两种方法可以从那里过滤。请注意,如果使用
rowMeans()
拥有非常大的数据帧,则会将其强制转换为一个矩阵(因此这可能会很慢)。通常不是一个问题,而是一个重要的警告。希望这有帮助

# Replace each cell with T/F based on the function (grepl() / is.na())
idx_df <- rapply(df, function(x) grepl("^(\\s*|NO_DATA)$", x) | is.na(x), how = "replace")

# Check if there were no matches in the function (i.e., there is at least one FALSE)
idx <- do.call(pmin, idx_df) == 0

# Check is the rowMean is less than 1 (not all TRUE)
idx2 <- rowMeans(idx_df) < 1

identical(idx, idx2) # same result
[1] TRUE

df[idx, ]
     a b c d       e
6 <NA> 2 2 2       2
7    3   3 3 NO_DATA
#根据函数(grepl()/is.na())用T/F替换每个单元格
idx_df您可以使用以下方法进行子集:

df[rowSums(!sapply(df, function(x) trimws(x) %in% c("", "NO_DATA") | is.na(x))) > 0, ]

     a b c d       e
6 <NA> 2 2 2       2
7    3   3 3 NO_DATA
df[行和(!sapply(df,函数(x)trimws(x)%in%c(“,“无数据”)| is.na(x))>0,]
a、b、c、d、e
6  2 2 2       2
7 3无数据
您可以使用以下方法创建子集:

df[rowSums(!sapply(df, function(x) trimws(x) %in% c("", "NO_DATA") | is.na(x))) > 0, ]

     a b c d       e
6 <NA> 2 2 2       2
7    3   3 3 NO_DATA
df[行和(!sapply(df,函数(x)trimws(x)%in%c(“,“无数据”)| is.na(x))>0,]
a、b、c、d、e
6  2 2 2       2
7 3无数据

是否保留包含数值的行,而不是删除包含x、y或z的行,例如
df[rowSums(suppressWarnings(sapply(df,as.numeric)),na.rm=TRUE)>0,]
?不,此数值只是一个示例,可以是任何字符串或数字,而不是删除包含x、y或z的行,您想保留包含数值的行吗,例如
df[rowsumes(suppressWarnings(sapply(df,as.numeric)),na.rm=TRUE)>0,]
?不,这个数值只是一个例子,可以是任何字符串或数字
c(“,“No_DATA”)
都可以作为黑名单,太好了。@Emeeus,该黑名单不适用于您的示例数据,因为您有
如果它们都是相同的,那么我们可以做
df[df==“NO_data”| df==”]
c(“,“NO_data”)
将用作黑名单,太好了。@Emeeus,该黑名单不适用于您的示例数据,因为您有
,如果它们都相同,那么我们可以执行
df[df==“无数据”| df==”]