基于另一列提取R数据表中的唯一行



我有一个更大的数据框架,其中包含5年的数据。我想删除在给定年份中重复的行,而不从以后的年份中删除这些行。下面是一个例子。

Year  Color    X   Y
2014  red      1   3
2014  red      1   3
2014  blue     1   3
2015  red      1   3
2015  blue     1   3
2015  yellow   1   3

在这个例子中,我想删除2014年颜色红色的重复行,而不删除2015年红色的行。我厌倦了以下代码:

df <- df[!duplicated(Color), by = (Year)]

此代码删除了重复的2014年红色,但也删除了2015年蓝色和2015年红色。

j部分中的子集:

library(data.table)
setDT(df)
df[, .SD[!duplicated(Color)], Year]
#   Year  Color X Y
#1: 2014    red 1 3
#2: 2014   blue 1 3
#3: 2015    red 1 3
#4: 2015   blue 1 3
#5: 2015 yellow 1 3

另一种方法是按YearColor分组并选择第一行。

df[, .SD[seq_len(.N) == 1], .(Year, Color)]

或者最简单的方法是选择unique行并指定by:

unique(df, by = c('Year', 'Color'))

数据

df <- structure(list(Year = c(2014L, 2014L, 2014L, 2015L, 2015L, 2015L
), Color = c("red", "red", "blue", "red", "blue", "yellow"), 
X = c(1L, 1L, 1L, 1L, 1L, 1L), Y = c(3L, 3L, 3L, 3L, 3L, 
3L)), class = "data.frame", row.names = c(NA, -6L))

dplyr包的另一个替代方案。数据取自Ronak Shah提供的解决方案。

library(dplyr)
df %>% group_by(Color) %>% 
distinct()

输出

# A tibble: 5 x 4
# Groups:   Color [3]
#   Year Color      X     Y
# <int> <chr>  <int> <int>
#1  2014 red        1     3
#2  2014 blue       1     3
#3  2015 red        1     3
#4  2015 blue       1     3
#5  2015 yellow     1     3

除非我遗漏了什么,否则你不是简单地问如何从数据帧中删除重复项吗?

library(dplyr)
df %>%
distinct()

最新更新