R - 根据两列识别并删除重复行
R - Identify and remove duplicate rows based on two columns
我有一些数据如下所示:
Course_ID Text_ID
33 17
33 17
58 17
5 22
8 22
42 25
42 25
17 26
17 26
35 39
51 39
没有编程背景,我发现表达我的问题很棘手,但这里是:我只想保留 Course_ID
不同但 Text_ID
相同的行.因此,例如,最终数据将如下所示:
Course_ID Text_ID
5 22
8 22
35 39
51 39
如您所见,Text_ID
22 和 39 是唯一具有不同 Course_ID
值的。我怀疑对数据进行子集化是可行的方法,但正如我所说,我对这种事情还是个新手,非常感谢任何关于如何处理这个问题的建议。
这是我对 rlist
和 dplyr
的处理方法:
library(dplyr)
your_data %>%
split(~ Text_ID) %>%
rlist::list.filter(length(unique(Course_ID)) == length(Course_ID)) %>%
bind_rows()
Returns:
# A tibble: 4 x 2
Course_ID Text_ID
<dbl> <dbl>
1 5 22
2 8 22
3 35 39
4 51 39
# Data used:
your_data <- structure(list(Course_ID = c(33, 33, 58, 5, 8, 42, 42, 17, 17, 35, 51), Text_ID = c(17, 17, 17, 22, 22, 25, 25, 26, 26, 39, 39)), row.names = c(NA, -11L), class = c("tbl_df", "tbl", "data.frame"))
如果没有anyDuplicated
,您可以使用ave
测试。
x[ave(x$Course_ID, x$Text_ID, FUN=anyDuplicated)==0,]
# Course_ID Text_ID
#4 5 22
#5 8 22
#10 35 39
#11 51 39
数据:
x <- read.table(header=TRUE, text="Course_ID Text_ID
33 17
33 17
58 17
5 22
8 22
42 25
42 25
17 26
17 26
35 39
51 39")
Select那些没有重复Course_ID
的组。
在dplyr
中你可以写成-
library(dplyr)
df %>% group_by(Text_ID) %>% filter(n_distinct(Course_ID) == n()) %>% ungroup
# Course_ID Text_ID
# <int> <int>
#1 5 22
#2 8 22
#3 35 39
#4 51 39
并在 data.table
-
library(data.table)
setDT(df)[, .SD[uniqueN(Course_ID) == .N], Text_ID]
我有一些数据如下所示:
Course_ID Text_ID
33 17
33 17
58 17
5 22
8 22
42 25
42 25
17 26
17 26
35 39
51 39
没有编程背景,我发现表达我的问题很棘手,但这里是:我只想保留 Course_ID
不同但 Text_ID
相同的行.因此,例如,最终数据将如下所示:
Course_ID Text_ID
5 22
8 22
35 39
51 39
如您所见,Text_ID
22 和 39 是唯一具有不同 Course_ID
值的。我怀疑对数据进行子集化是可行的方法,但正如我所说,我对这种事情还是个新手,非常感谢任何关于如何处理这个问题的建议。
这是我对 rlist
和 dplyr
的处理方法:
library(dplyr)
your_data %>%
split(~ Text_ID) %>%
rlist::list.filter(length(unique(Course_ID)) == length(Course_ID)) %>%
bind_rows()
Returns:
# A tibble: 4 x 2
Course_ID Text_ID
<dbl> <dbl>
1 5 22
2 8 22
3 35 39
4 51 39
# Data used:
your_data <- structure(list(Course_ID = c(33, 33, 58, 5, 8, 42, 42, 17, 17, 35, 51), Text_ID = c(17, 17, 17, 22, 22, 25, 25, 26, 26, 39, 39)), row.names = c(NA, -11L), class = c("tbl_df", "tbl", "data.frame"))
如果没有anyDuplicated
,您可以使用ave
测试。
x[ave(x$Course_ID, x$Text_ID, FUN=anyDuplicated)==0,]
# Course_ID Text_ID
#4 5 22
#5 8 22
#10 35 39
#11 51 39
数据:
x <- read.table(header=TRUE, text="Course_ID Text_ID
33 17
33 17
58 17
5 22
8 22
42 25
42 25
17 26
17 26
35 39
51 39")
Select那些没有重复Course_ID
的组。
在dplyr
中你可以写成-
library(dplyr)
df %>% group_by(Text_ID) %>% filter(n_distinct(Course_ID) == n()) %>% ungroup
# Course_ID Text_ID
# <int> <int>
#1 5 22
#2 8 22
#3 35 39
#4 51 39
并在 data.table
-
library(data.table)
setDT(df)[, .SD[uniqueN(Course_ID) == .N], Text_ID]