从包含R中空字符串的tibble中删除行



一个让我困惑的基本问题。如何从包含空字符串的tibble中删除行?

例如:

library(dplyr)
df <- data.frame(
data = c(
"1 1 2 2 3, 3 4 5 6 7",
"1 1 3 3, 2 3 4 5",
", ",
"1 1, 2 3"
),
num = c(2, 3, 1, 4)
)

dfTest <- df %>%
as_tibble() %>%
setNames(c("data", "num")) %>%
separate(data, c("col1", "col2"), ", ")
> dfTest
# A tibble: 4 × 3
col1        col2          num
<chr>       <chr>       <dbl>
1 "1 1 2 2 3" "3 4 5 6 7"     2
2 "1 1 3 3"   "2 3 4 5"       3
3 ""          ""              1
4 "1 1"       "2 3"           4

通过查看dfTest,我们可以看到第3行包含空字符串。我正在寻找一种从tibble中删除这些类型的行的方法?

一个不同的解决方案:

dfTest <- dfTest %>% 
filter(. != "")
# A tibble: 3 x 3
col1      col2        num
<chr>     <chr>     <dbl>
1 1 1 2 2 3 3 4 5 6 7     2
2 1 1 3 3   2 3 4 5       3
3 1 1       2 3           4

根据您的问题,您是否只想在两个字符串都为空时删除该行,或者其中一个为空时才删除该行还不太清楚。

我对您的示例进行了一些修改,以指出差异,并详细介绍了一种方法,该方法允许选择要检查的列,并澄清您是否希望所有列或其中任何列都为空,以便删除它们。

library(dplyr)
library(tidyr)
df <- data.frame(
data = c(
"1 1 2 2 3, 3 4 5 6 7",
"1 1 3 3, ",
", ",
"1 1, 2 3"
),
num = c(2, 3, 1, 4)
)

dfTest <- df %>%
as_tibble() %>%
setNames(c("data", "num")) %>%
separate(data, c("col1", "col2"), ", ") %>% 
rowwise() %>% 
filter(!Reduce(f = `|`, x = c_across(col1:col2)=="")) %>%  
ungroup()
dfTest
#> # A tibble: 2 × 3
#>   col1      col2        num
#>   <chr>     <chr>     <dbl>
#> 1 1 1 2 2 3 3 4 5 6 7     2
#> 2 1 1       2 3           4

创建于2021-11-07由reprex包(v2.0.1(

尝试使用baseR、

dfTest[!dfTest$col1 == "", ]
col1      col2        num
<chr>     <chr>     <dbl>
1 1 1 2 2 3 3 4 5 6 7     2
2 1 1 3 3   2 3 4 5       3
3 1 1       2 3           4

最新更新