我想从一个数据集中识别(并随后删除)字符向量,这些字符向量由全部相等的条目组成(例如没有任何变化)。
test_data <- tibble(a = c("A", "B", "C"), b = c("A", "A", "A"), c = c("", "", ""), d = 1:3)
test_data
# A tibble: 3 x 4
a b c d
<chr> <chr> <chr> <dbl>
1 A A "" 1
2 B A "" 2
3 C A "" 3
我希望结果是这样的。
# A tibble: 3 x 2
a d
<chr> <dbl>
1 A 1
2 B 2
3 C 3
当然,我可以通过这样的方式来实现
out <- c("b", "c")
test_data %>% select(- one_of((out)))
但由于我有很多列和很多行,我不想 "手动 "地去做。
我发现这个 但它只适用于数字向量。
你可以做。
test_data %>%
select_if(~ !all(. == first(.)))
a
<chr>
1 A
2 B
3 C
或者:
test_data %>%
select_if(~ n_distinct(.) > 1)
基础R解决方案
# (1)
test_data[sapply(test_data, function(x) length(unique(x)) > 1)]
# (2)
Filter(function(x) length(unique(x)) > 1, test_data)
dplyr 1.0.0解决方案
test_data %>%
select(where(~ n_distinct(.x) > 1))
产量
# # A tibble: 3 x 2
# a d
# <chr> <int>
# 1 A 1
# 2 B 2
# 3 C 3
你也可以用 keep
:
test_data%>%
keep(~length(unique(.))>1)
# A tibble: 3 x 2
a d
<chr> <int>
1 A 1
2 B 2
3 C 3
有点晚,但你也可以用 base::Filter()
来识别只包含重复的列。
Filter(function(x) !all(duplicated(x)[-1L]), test_data)
# A tibble: 3 x 1
a
<chr>
1 A
2 B
3 C
一个选项带 Filter
和 length
的 unique
中的元素 base R
Filter(function(x) length(unique(x)) > 1, test_data)
# A tibble: 3 x 2
# a d
# <chr> <int>
#1 A 1
#2 B 2
#3 C 3
或与 dplyr
library(dplyr)
test_data %>%
select(where(~ length(unique(.)) > 1))