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

时间:2020-06-05 13:34:02

标签: r dplyr subset

我想从数据集中识别(然后删除)字符向量,这些字符向量都相等(例如,没有任何变化):

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

但是由于我有很多这些列和很多行,所以我不想不必“手动”进行操作。

我找到了这个but it only works for numeric vectors.

5 个答案:

答案 0 :(得分:3)

您可以这样做:

process.env.MONGODB_URL

或者:

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

  a    
  <chr>
1 A    
2 B    
3 C 

答案 1 :(得分:2)

Base 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

答案 2 :(得分: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

答案 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 

答案 4 :(得分:1)

Filter中有length个元素unique中的base RFilter(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))

Ready to Program