由于我的数据要复杂得多,我制作了一个较小的样本数据集(我留下了重塑形式来展示我如何生成数据)。
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之间有一个名为加权的列,然后在计算这些独特的组合时,我将包括每个加权。这并不重要,因为所有权重都是小的正整数值,因此我可以提前复制行来计算权重,然后将唯一对列表。
答案 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