由于我的数据要复杂得多,我制作了一个较小的样本数据集(我离开了重塑,以显示我是如何生成数据的).
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)
Run Code Online (Sandbox Code Playgroud)
这导致......
> 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
Run Code Online (Sandbox Code Playgroud)
现在我基本上想要使用像unique这样的函数,但是忽略order以找到前3个元素唯一的位置.
因此在这种情况下:
第5行我会得到A,B,C
我会在第1行和第3行中有A,B,D
我会在第2行和第4行中有A,C,D
此外,我需要对这些"独特"事件进行统计
还有2件事.首先,我的值是字符串,我需要将它们保留为字符串.其次,如果可能的话,我会在年和1之间有一个名为加权的列,然后在计算这些独特的组合时,我将包括每个加权.这并不重要,因为所有权重都是小的正整数值,因此我可能会更早地复制行以考虑加权,然后将唯一对列表.
你可以这样做:
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"
Run Code Online (Sandbox Code Playgroud)
对于数据框的每一行,使用第1列,第2列和第3列(如帖子中标记的)进行排序sort,然后使用连接paste0.由于顺序无关紧要,因此可确保相同的案例标记一致.
请注意,该paste0功能相当于paste(..., sep = "").该collapse参数表示将向量的值连接成单个字符串,向量值由传递给的值分隔collapse.在这种情况下,我们设置collapse = "",这意味着将有值之间没有分离,产生"ABC","ACD"等
然后您可以使用table以下方法获取每个组合的计数:
table(combos)
# ABC ACD BCD
# 2 1 2
Run Code Online (Sandbox Code Playgroud)