【问题标题】:In R, remove all instances of a row with exactly n duplicates在 R 中,删除一行的所有实例,其中恰好有 n 个重复项
【发布时间】:2021-07-18 15:46:20
【问题描述】:

我在 R 中有一个包含学生成绩数据的数据框。下面是一些示例数据来展示它的结构:

student.data <- data.frame(
                 "CourseNumber" = c(101, 101, 101, 102, 102, 102, 103, 103, 104, 104, 104, 105, 106, 106, 106),
                 "TermID" = c("T1", "E1", "S1", "T1", "E1", "S1", "T1", "S1", "T1", "E1", "S1", "S1", "T1", "E1", "S1"),
                 "StudentID" = c("9100", "9100", "9100", "9100", "9100", "9100", "9100", "9100", "9100", "9100", "9100", "8640", "8640", "8640", "8640"),
                 "Grade" = c(92, 80, 91, 83, 87, 84, 79, 79, 79, 85, 81, 98, 93, 97, 94))

student.data

##    CourseNumber TermID StudentID Grade
## 1           101     T1      9100    92
## 2           101     E1      9100    80
## 3           101     S1      9100    91

## 4           102     T1      9100    83
## 5           102     E1      9100    87
## 6           102     S1      9100    84

## 7           103     T1      9100    79
## 8           103     S1      9100    79

## 9           104     T1      9100    78
## 10          104     E1      9100    85
## 11          104     S1      9100    81

## 12          105     S1      8640    98

## 13          106     T1      8640    93
## 14          106     E1      8640    97
## 15          106     S1      8640    94

一个学生通常(但不总是)在一门课程中获得 3 个成绩:S1、E1 和 S1。这就是为什么我在打印输出中添加了额外的中断——每组 3 代表一个学生在单个课程中的成绩。 T1是他的考前成绩,E1是他的期末考试成绩,S1是他的考后成绩。这 3 个应该与这个公式 S1 = (80%)(T1) + (20%)(E1) 相关,我正在寻找获得更高 S1 成绩的实例。

我的问题是我需要删除第 7、8 和 12 行,因为这些课程并未授予所有 3 个成绩(T1、E1、S1)。这会有所帮助,因为我已经有一些代码可以成功计算出老师给出的“碰撞”量,但是每次到达一个没有全部 3 个成绩的学生课程组合(T1、E1、和 S1)。

所以,我的问题是:如何删除不完全是 3 个重复项的所有行,由变量 CourseNumber 和 StudentID 确定? (如果它删除所有 少于 个重复项的行,或者即使它只是删除了恰好有 2 个重复项的所有行,则该解决方案将有效。)

我找到了this clever answer 并尝试了下面的代码,但它只删除了根本没有重复的行。因此,它会删除第 12 行,但不会同时删除第 7 行和第 8 行。

temp <- student.data[ , c("CourseNumber","StudentID") ]
student.data <- student.data[duplicated(temp) | duplicated(temp, fromLast = TRUE), ]

student.data

##    CourseNumber TermID StudentID Grade
## 1           101     T1      9100    92
## 2           101     E1      9100    80
## 3           101     S1      9100    91

## 4           102     T1      9100    83
## 5           102     E1      9100    87
## 6           102     S1      9100    84

## 7           103     T1      9100    79
## 8           103     S1      9100    79

## 9           104     T1      9100    78
## 10          104     E1      9100    85
## 11          104     S1      9100    81

## 13          106     T1      8640    93
## 14          106     E1      8640    97
## 15          106     S1      8640    94

这是我想要实现的输出:

##    CourseNumber TermID StudentID Grade
## 1           101     T1      9100    92
## 2           101     E1      9100    80
## 3           101     S1      9100    91

## 4           102     T1      9100    83
## 5           102     E1      9100    87
## 6           102     S1      9100    84

## 9           104     T1      9100    78
## 10          104     E1      9100    85
## 11          104     S1      9100    81

## 13          106     T1      8640    93
## 14          106     E1      8640    97
## 15          106     S1      8640    94

【问题讨论】:

    标签: r duplicates data-cleaning


    【解决方案1】:

    根据描述,OP 可能需要返回具有 3 行的组

    library(dplyr)
    student.data %>% 
       group_by(CourseNumber, StudentID) %>%
       filter(n() == 3) %>%
       ungroup
    

    -输出

    # A tibble: 12 x 4
    #   CourseNumber TermID StudentID Grade
    #          <dbl> <chr>  <chr>     <dbl>
    # 1          101 T1     9100         92
    # 2          101 E1     9100         80
    # 3          101 S1     9100         91
    # 4          102 T1     9100         83
    # 5          102 E1     9100         87
    # 6          102 S1     9100         84
    # 7          104 T1     9100         79
    # 8          104 E1     9100         85
    # 9          104 S1     9100         81
    #10          106 T1     8640         93
    #11          106 E1     8640         97
    #12          106 S1     8640         94
    

    【讨论】:

    • 谢谢!!我刚刚添加了我的预期输出。这正是我想要的,包括 filter(n() == 3)。看到你展示的其他例子也很有帮助。等待期结束后,我会接受这个答案!
    猜你喜欢
    • 2021-11-26
    • 2013-03-16
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多