【问题标题】:Creating a new column to identify if two columns are identical but have distinct value in the third column创建一个新列以识别两列是否相同但在第三列中具有不同的值
【发布时间】:2021-02-15 02:25:51
【问题描述】:

我想在我的数据框中添加一个包含 true 和 false 值的新列,以告诉我两列是否有重复值,但第三列是否有不同的值。

这是我现在的桌子:

| ID  | name | age|student|
| --- | -----|----|-------|
| 1   | Joe  |23  | Yes   |
| 2   | Rayan|13  | Yes   |
| 3   | Sara |20  | No    |
| 4   | Rayan|21  | Yes   |
| 5   | Sara |20  | Yes   |
| 6   | Joe  |23  | Yes   |

我想检查姓名和年龄是否有重复的值,但学生的值是否不同。我希望结果列如下所示:

| ID  | name | age|student|satisfy|
| --- | -----|----|-------|-------|
| 1   | Joe  |23  | Yes   | False |
| 2   | Rayan|13  | Yes   | False |
| 3   | Sara |20  | No    | False |
| 4   | Rayan|21  | Yes   | False |
| 5   | Sara |20  | Yes   | True  |
| 6   | Joe  |23  | Yes   | False |

只有 Sara 满足条件,因为 age 和 name 具有重复值,但 student 具有不同的值。我如何在 R 中做到这一点?

【问题讨论】:

    标签: r


    【解决方案1】:

    也许这样的事情会帮助你:

    df <- data.frame(
      id = c(1:6),
      name = c("Joe", "Rayan", "Sara", "Rayan", "Sara", "Joe"),
      age = c(23, 13, 20, 21, 20, 23),
      student = c("Yes", "Yes", "No", "Yes", "Yes", "Yes")
    )
    
    (df$satisfy <- duplicated(df[,2:3]) & !(duplicated(df[,2:4])))
    [1] FALSE FALSE FALSE FALSE  TRUE FALSE
    

    如果姓名和年龄重复,则duplicated(df[,2:3]) 检查的第一个条件返回TRUE

    第二个条件duplicated(df[,2:4] 返回TRUE 如果姓名、年龄和学生重复但随后否定!

    结合起来应该会给你想要的列结果。

    干杯 汉内斯

    【讨论】:

    • 这是一个简单而准确的答案。我试图将 from_last 设置为 TRUE,因此我对 Sara 的两个条目都得到了 TRUE,但我做不到。有办法吗?
    • 如果名字足够好,我会跟进(df$satisfyAll &lt;- df$name %in% df$name[df$satisfy])。如果名称不够好,我会生成一个帮助列,例如。 name_age 并使用这个进行跟进。但可能在这种情况下,如果 dplyr 没问题,那么我会选择像 @akrun、df %&gt;% group_by(name, age) %&gt;% mutate( satisfy = ifelse(n_distinct(student)==2, TRUE, FALSE) ) %&gt;% ungroup() 这样的答案
    • 为什么我们需要跟进?
    • 两个条件都只返回逻辑向量,不知道哪些行属于一起。您可以通过管道进行跟进或使用 match 执行某些操作以提取重复项的名称,但为什么要尝试在一行中完成所有操作。
    【解决方案2】:

    使用dplyr

    library(dplyr)
    df %>%
        group_by(name, age) %>% 
        mutate(ind =  n_distinct(student) > 1, 
        student = ind & duplicated(ind), ind = NULL) %>%
        ungroup
    # A tibble: 6 x 4
    #     id name    age student
    #  <int> <chr> <dbl> <lgl>  
    #1     1 Joe      23 FALSE  
    #2     2 Rayan    13 FALSE  
    #3     3 Sara     20 FALSE  
    #4     4 Rayan    21 FALSE  
    #5     5 Sara     20 TRUE   
    #6     6 Joe      23 FALSE  
    

    【讨论】:

    • 如果我有两个以上的条目,这将不起作用。例如,一旦我添加另一行,其中 Sara 的年龄为 20,它会导致另一个 true。我只想得到其中一个。
    猜你喜欢
    • 2016-04-25
    • 1970-01-01
    • 2015-07-17
    • 2022-11-17
    • 1970-01-01
    • 2021-05-16
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多