【问题标题】:Show duplicates by group using data.table使用 data.table 按组显示重复项
【发布时间】:2015-01-06 09:46:54
【问题描述】:

我正在尝试使用 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,而不是按年份。我将如何使用 data.table 提取 2012 年国家“C”的单个重复值?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    只需将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)(如果 data.table 是键)

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

    【讨论】:

    • 使用 dplyr (library(dplyr)),你可以做到 dt %&gt;% count(country, year) %&gt;% filter(n &gt; 1)dt %&gt;% select(country, year) %&gt;% filter(duplicated(.))
    • 另一个更字面的选项:dt[, .SD[duplicated(country)], by = year]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多