【问题标题】:Finding unique group of rows in a data frame在数据框中查找唯一的行组
【发布时间】:2015-01-14 06:26:34
【问题描述】:

我有一个数据框,我想在其中比较一组行并仅在整个组相同时才删除。例如:

df<-data.frame(X=c("a", "a", "a", "b", "b", "b", "c", "c", "c"), Y=c(1,2,1,2,2,2,1,2,1), Z=c("ABC","DEF","ABC", "DEF", "DEF", "DEF", "ABC", "DEF", "ABC"))

  X Y   Z
1 a 1 ABC
2 a 2 DEF
3 a 1 ABC
4 b 2 DEF
5 b 2 DEF
6 b 2 DEF
7 c 1 ABC
8 c 2 DEF
9 c 1 ABC

这里的组由 X 列标识,我想在不同的组之间进行比较。因此,这里的组 a 和组 c 是相同的。我想得到如下最终想要的结果:

  GroupID Y   Z
1 1       1 ABC
2 1       2 DEF
3 1       1 ABC
4 2       2 DEF
5 2       2 DEF
6 2       2 DEF

知道如何进行这种比较吗?

【问题讨论】:

  • 那么,df
  • @OliverKeyes 这将逐行删除,在这种情况下它将返回 5 行。在上面的预期答案中,有 6 行。
  • 那么,您希望为 X 的每个唯一值检索不同的 (Y,Z) 元组?

标签: r dataframe grouping


【解决方案1】:

baseR 可能性:

# For each 'X', collapse 'Y' and 'Z' to a vector
l <- by(df[ , c("Y", "Z")], df$X, function(dat) paste0(dat, collapse = ""))

# select names of unique list elements
nm <- names(l)[!duplicated(l)]

# use these names to subset the data frame
df[df$X %in% nm, ]
#   X Y   Z
# 1 a 1 ABC
# 2 a 2 DEF
# 3 a 1 ABC
# 4 b 2 DEF
# 5 b 2 DEF
# 6 b 2 DEF

【讨论】:

    【解决方案2】:

    您可能需要查看“比较”包中的compare 函数。这是一种可能性:

    library(compare)
    x <- with(df, split(df[-1], df[[1]]))
    Splits <- combn(names(x), 2)
    Comparison <- apply(Splits, 2, function(y) {
      compare(x[y[1]], x[y[2]], allowAll = TRUE)$result
    })
    Splits[, Comparison]
    # [1] "a" "c"
    

    从中我们可以看到组“a”和“c”是重复的,我们可以使用它来对原始数据集进行子集化。


    我在此答案中使用了allowAll = TRUE,但您可能需要查看compare 中提供的其他选项,以确定您在比较中实际希望允许哪些转换。

    【讨论】:

    • 我的数据框与上面问题中显示的略有不同。当我打印compare 输出时。我得到以下结果:FALSE [TRUE TRUE TRUE TRUE TRUE] 单个列比较很好(显示全部为真)但我不明白为什么结果是FALSE。有什么想法吗?
    猜你喜欢
    • 2020-03-05
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    相关资源
    最近更新 更多