从df中删除包含相同字符串的字符向量。

问题描述 投票:1回答:2

我想从一个数据集中识别(并随后删除)字符向量,这些字符向量由全部相等的条目组成(例如没有任何变化)。

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)))

但由于我有很多列和很多行,我不想 "手动 "地去做。

我发现这个 但它只适用于数字向量。

r dplyr subset
2个回答
3
投票

你可以做。

test_data %>%
 select_if(~ !all(. == first(.)))

  a    
  <chr>
1 A    
2 B    
3 C 

或者:

test_data %>%
 select_if(~ n_distinct(.) > 1)

2
投票

基础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

1
投票

你也可以用 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

1
投票

有点晚,但你也可以用 base::Filter() 来识别只包含重复的列。

Filter(function(x) !all(duplicated(x)[-1L]), test_data)

# A tibble: 3 x 1
  a    
  <chr>
1 A    
2 B    
3 C 

1
投票

一个选项带 Filterlengthunique 中的元素 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))
© www.soinside.com 2019 - 2024. All rights reserved.