使用data.table按组显示重复项

3

我正在尝试使用data.table按组显示重复项。 更具体地说,我想找出在给定年份内一个国家是否有多个观测值。 这是一个样本数据集:

# load data.table package, assuming it's installed
library(data.table)

# create dataset
year    <- rep(2010:2012, 3)
country <- c(rep("A", 3), rep("B", 3), rep("C", 3))
value   <- sample(2:200, 9, replace = TRUE)
df <- cbind(year, country, value)
df <- rbind(df, c(2012, "C", 20))
df # show data

# put data frame in data.table format and set year as key
dt <- data.table(df)
setkey(dt, year)

请注意,对于2012年,国家“C”有两个观测值,而所有其他国家的观测值按年份唯一。
我原以为以下代码将为我提供重复的国家和年份名称:
dt[duplicated(country), country, by = year]

相反,它显示了从2011年起的所有数据,这意味着重复的函数被应用于整个数据表而不是按年份。如果我想使用data.table提取2012年国家“C”的单个重复值,该怎么做?

1个回答

6

只需将 country 添加到您的 setkey 中,然后在 dt 中使用 duplicated(dt) 即可。

setkey(dt, year, country)
dt[duplicated(dt)]
#    year country value
# 1: 2012       C    20

如果您只想显示国家,请使用以下代码:
dt[duplicated(dt), country]
## [1] "C"

如果您不想键入数据集(例如,如果您想保留顺序),则可以在duplicatedby参数中指定要区分的列。

dt[duplicated(dt, by = c("year", "country")), country]
## [1] "C"

编辑:

自v1.9.8版本以来,所有列都在by中使用(而不是键),因此,如果数据表已经被键化,则需要显式传递by = key(dt)

dt[duplicated(dt, by = key(dt))]

1
使用dplyr(library(dplyr)),您可以执行dt %>% count(country, year) %>% filter(n > 1)dt %>% select(country, year) %>% filter(duplicated(.)) - talat
2
另一个更直接的选项是:dt[, .SD[duplicated(country)], by = year] - eddi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接