如果某些列包含字符串,则 R 过滤数据框

时间:2021-03-12 14:54:40

标签: r dataframe filter

这可能看起来相当琐碎,但我几乎不知道任何 R 并且 google-fu 没有帮助。

所以,场景如下: 我有一个包含 37 列的数据框,我需要对其进行过滤,只保留那些在 2 列(EMPRESA、PAIS)中的任何列中包含某个字符串的行。

到目前为止我尝试过的:

        if(input$ExperienciasSearchHidden == "")
        {
        }
        else
        {
            print(colnames(DFfilters))
            DFfilters <- DFfilters  [which  (
                                                    DFfilters$EMPRESA       ==  "ESPAÑAAA"
                                                &   DFfilters$PAIS          ==  "ESPAÑAAA"
                                            )
                                    ,]
        }

输出(错误):

Warning: Error in if: missing value where TRUE/FALSE needed
  [No stack trace available]

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

带有子集的代码的第二部分没有任何问题,但问题出在 if 语句中。 input$ExperienciasSearchHidden 很可能是 NA。

DFfilters=data.frame(EMPRESA=c("a", "ESPAÑAAA", "b"), PAIS=c(NA,"ESPAÑAAA", "a"), stringsAsFactors = FALSE)
DFfilters  [which  (
  DFfilters$EMPRESA       ==  "ESPAÑAAA"
  &   DFfilters$PAIS          ==  "ESPAÑAAA"
)
,]
   EMPRESA     PAIS
2 ESPAÑAAA ESPAÑAAA

NA==""
NA

if (NA) {
  print("problem")
}
Error in if (NA) { : missing value where TRUE/FALSE needed

答案 1 :(得分:0)

在没有可重现数据的情况下,这里有一个模拟数据的解决方案:

library(dplyr)
df %>%
  rowwise() %>%
  filter(any(str_detect(c_across(), 'EMPRESA|PAIS')))
# A tibble: 3 x 2
# Rowwise: 
  v1      v1.1   
  <chr>   <chr>  
1 x       PAIS   
2 EMPRESA x      
3 x       EMPRESA

数据:

df <- data.frame(
  v1 = c("x", "EMPRESA", "y", "z", "x"),
  v1 = c("PAIS", "x", "y", "z", "EMPRESA")
)