一个让我困惑的基本问题。如何从包含空字符串的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(
尝试使用base
R、
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