【问题标题】:Delete character vectors from df that contain the same string从 df 中删除包含相同字符串的字符向量
【发布时间】:2020-06-05 13:34:02
【问题描述】:

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

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.

【问题讨论】:

    标签: r dplyr subset


    【解决方案1】:

    你可以这样做:

    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
    

    【讨论】:

      【解决方案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
      

      【讨论】:

        【解决方案4】:

        有点晚了,但您也可以使用 base::Filter() 来识别仅包含重复项的列:

        Filter(function(x) !all(duplicated(x)[-1L]), test_data)
        
        # A tibble: 3 x 1
          a    
          <chr>
        1 A    
        2 B    
        3 C 
        

        【讨论】:

          【解决方案5】:

          base R 中的 unique 元素中的 Filterlength 选项

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-04-14
            • 1970-01-01
            • 2020-09-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-08-19
            相关资源
            最近更新 更多