在R中查找唯一元组但忽略顺序

时间:2015-05-19 17:39:08

标签: r unique

由于我的数据要复杂得多,我制作了一个较小的样本数据集(我留下了重塑形式来展示我如何生成数据)。

set.seed(7)
x = rep(seq(2010,2014,1), each=4)
y = rep(seq(1,4,1), 5)
z = matrix(replicate(5, sample(c("A", "B", "C", "D"))))
temp_df = cbind.data.frame(x,y,z)
colnames(temp_df) = c("Year", "Rank", "ID")
head(temp_df)
require(reshape2)
dcast(temp_df, Year ~ Rank)

导致......

> dcast(temp_df, Year ~ Rank)
Using ID as value column: use value.var to override.
  Year 1 2 3 4
1 2010 D B A C
2 2011 A C D B
3 2012 A B D C
4 2013 D A C B
5 2014 C A B D

现在我基本上想要使用像unique这样的函数,但忽略顺序来查找前3个元素唯一的位置。

因此在这种情况下:

我会在第5行中有A,B,C

我会在第1行和第3行中有A,B,D

我会在第2行和第4行中有A,C,D

此外,我需要这些"独特"事件

还有2件事。首先,我的值是字符串,我需要将它们保留为字符串。 其次,如果可能的话,我会在年份和1之间有一个名为加权的列,然后在计算这些独特的组合时,我将包括每个加权。这并不重要,因为所有权重都是小的正整数值,因此我可以提前复制行来计算权重,然后将唯一对列表。

2 个答案:

答案 0 :(得分:5)

你可以这样做:

df <- dcast(temp_df, Year ~ Rank)

combos <- apply(df[, 2:4], 1, function(x) paste0(sort(x), collapse = ""))

combos
#     1     2     3     4     5 
# "BCD" "ABC" "ACD" "BCD" "ABC" 

对于数据框的每一行,第1,2和3列中的值(如帖子中标记的)使用sort进行排序,然后使用paste0进行连接。由于订单并不重要,因此可确保相同的案例标记一致。

请注意,paste0功能相当于paste(..., sep = "")collapse参数表示将向量的值连接成单个字符串,向量值由传递给collapse的值分隔。在这种情况下,我们设置collapse = "",这意味着值之间不会分开,从而导致"ABC""ACD"等。

然后,您可以使用table获取每个组合的计数:

table(combos)
# ABC ACD BCD 
#   2   1   2 

答案 1 :(得分:0)

这与@Alex_A相同,但使用了tidyverse函数:

myBranch