【问题标题】:Find mismatches in the same column considering variables in another column考虑另一列中的变量,查找同一列中的不匹配
【发布时间】:2021-03-02 12:57:07
【问题描述】:

您好,我有以下数据框

df = rbind(c('John', '1', 'a', 'a'), 
            c('John', '1', 'a', 'a'), 
            c('David', '2', 'b', 'b'), 
            c('David', '2', 'b', 'b'),
            c('Jack', '3', 'b', 'b'),
            c('Jack', '3', 'b', 'b'),
           c('David', '1', 'b', 'b'),
            c('Chris', '3', 'b', 'b'),
            c('Peter', '4', 'b', 'b')) %>%
    data.frame

colnames(df) <- c('name', paste('t', 1:3, sep = ''))

   name t1 t2 t3
1  John  1  a  a
2  John  1  a  a
3 David  2  b  b
4 David  2  b  b
5  Jack  3  b  b
6  Jack  3  b  b
7 David  1  b  b
8 Chris  3  b  b
9 Peter  4  b  b

在这里,列 't1' 应该对每个名字都是唯一的 - 所以 1 代表约翰,2 代表大卫,3 代表杰克,等等。所以基本上,如果一个变量,比如 t1 中的 1,对应两个不同的名称,那就错了。 所以我想为 t1 列中的每个数字找到具有 2 个不同名称的行。 在数据框中,John 和 David 对应 1,Jack 和 Chris 对应 3。所以我想检索这些人的行。

我想要这样的输出:

  name t1 t2 t3
  John  1  a  a
 David  1  b  b
  Jack  3  b  b
 Chris  3  b  b

这可以在dplyrtidyverse 或任何基本代码中完成吗?这需要forloops吗?我对 R 很陌生,所以正在寻找简单的方法来实现这一点。

提前致谢!


其他问题:

运行您的代码后,我的原始数据如下所示:

           name t1 t2 t3
1      John Doe  1  a  a
2      Doe John  1  a  a
3    Jone Doe A  1  b  b
4 David Freeman  2  b  b
5 Freeman David  2  b  b
6     Jack Chen  3  b  b
7     John Chen  3  b  b
8 Chris Baker F  4  b  b
9 Baker O Chris  4  b  b

正如您所见,所有的名字、中间名和姓氏都混在一起了。 名称格式有太多变化,因此代码将 John Doe、Doe John 和 John Doe A 都视为不同的人。 我的原始数据太大了,我无法手动修复名称。

我想清理这些名称(以便将 John Doe、Doe John 和 John Doe A 视为一个个体,但 Chris Baker F 和 Bake O Chris 应视为两个不同的唯一个体),以便在重新运行我的代码我可以有这样的输出:

          name t1 t2 t3
1     Jack Chen  3  b  b
2     John Chen  3  b  b
3 Chris Baker F  4  b  b
4 Baker O Chris  4  b  b

这可以使用 R 实现吗?

【问题讨论】:

    标签: r dataframe loops if-statement dplyr


    【解决方案1】:

    这行得通吗:

    library(dplyr)
    df %>% group_by(t1) %>% filter(n_distinct(name) > 1) %>% distinct() %>% arrange(t1)
    # A tibble: 4 x 4
    # Groups:   t1 [2]
      name  t1    t2    t3   
      <fct> <fct> <fct> <fct>
    1 John  1     a     a    
    2 David 1     b     b    
    3 Jack  3     b     b    
    4 Chris 3     b     b    
    

    【讨论】:

      【解决方案2】:

      在基础 R 中,您可以使用 unique + duplicated

      subset(unique(df),duplicated(t1) | duplicated(t1, fromLast = TRUE))
      
      #   name t1 t2 t3
      #1  John  1  a  a
      #5  Jack  3  b  b
      #7 David  1  b  b
      #8 Chris  3  b  b
      

      【讨论】:

      • 你能看看我的附加问题吗?在我的原始数据中,名称的格式有很多变化,所以这会导致一些问题!
      • 谢谢!这是我第一次在 Stack Overflow 上发布问题,所以不知道该怎么做。我将把它作为一个新问题发布。
      • @hheejuice 您可以通过单击左侧投票按钮旁边的复选标记来接受答案。每个帖子只能接受一个答案。阅读stackoverflow.com/help/someone-answers
      【解决方案3】:

      另一种解决方案

      library(tidyverse)
      df %>% 
        distinct(name, t1, .keep_all = T) %>% 
        group_by(t1) %>% 
        filter(n() > 1) %>% 
        ungroup()
      
      # A tibble: 4 x 4
        name  t1    t2    t3   
        <chr> <chr> <chr> <chr>
      1 John  1     a     a    
      2 Jack  3     b     b    
      3 David 1     b     b    
      4 Chris 3     b     b 
      

      【讨论】:

        猜你喜欢
        • 2017-09-07
        • 1970-01-01
        • 2021-01-23
        • 1970-01-01
        • 2019-04-18
        • 1970-01-01
        • 1970-01-01
        • 2022-12-11
        • 2021-02-08
        相关资源
        最近更新 更多