我有一个更大的数据框架,其中包含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
另一种方法是按Year
和Color
分组并选择第一行。
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()