将唯一ID分配给数据框中的等效行

时间:2017-06-16 08:55:54

标签: r dataframe combinations permutation

我想根据两个(或更多)变量的唯一组合计算id变量。考虑下面的简单示例:

# Example dataframe
mydf <- data.frame(var1 = LETTERS[c(1, 2, 1)], var2 = LETTERS[c(2, 1, 3)])
mydf

# var1 var2
# A    B
# B    A
# A    C

此处,第1行和第2行应具有相同的id,因为ABBA表示相同元素的组合。但是,第3行具有不同的id,因为AC组合只出现一次。

# Desired output
cbind(mydf, cid = c(1, 1, 2))

# var1 var2 cid
# A    B    1
# B    A    1
# A    C    2

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

我们可以sort按行,使用vector创建逻辑duplicated并获取cumsum

cbind(mydf, cid = cumsum(!duplicated(t(apply(mydf, 1, sort)))))

答案 1 :(得分:1)

您可以从基础R中的factor类型中受益:

mydf$cid <- as.numeric(factor(apply(mydf,1,function(x) paste0(sort(x), collapse = ""))))

它忽略了等效行在数据框中出现的顺序。 cumsum不起作用,例如,在数据框中切换第2行和第3行。