在R中查找唯一元组但忽略顺序
因为我的数据要复杂得多,所以我制作了一个较小的样本数据集(我保留了重塑以显示我是如何生成数据的) 这导致在R中查找唯一元组但忽略顺序,r,unique,R,Unique,因为我的数据要复杂得多,所以我制作了一个较小的样本数据集(我保留了重塑以显示我是如何生成数据的) 这导致 > 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这样的函
> 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个元素的唯一性
因此,在这种情况下:
我会在第五排有A,B,C
我会把A,B,D放在第1行和第3行
我会在第2行和第4行有A,C,D
我还需要这些“独特”事件的计数
还有两件事。首先,我的值是字符串,我需要将它们保留为字符串。
第二,如果可能的话,我会在年份和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"
这是与@Alex_A相同的解决方案,但使用了tidyverse函数:
library(purrr)
library(dplyr)
df <- dcast(temp_df, Year ~ Rank)
distinct(df, ID = pmap_chr(select(df, num_range("", 1:3)),
~paste0(sort(c(...)), collapse="")))
库(purrr)
图书馆(dplyr)
df您应该使用set.seed
来实现再现性哇哦,这是我睡眠不足的结果。这非常有效,您能带我浏览一下paste0(sort(x),collapse=“”)
吗,因为这当然不是我的真实数据,而且数据字符串更长。我知道什么是粘贴,但不是粘贴0,折叠是否会删除名称之间的引号?@qwertylpc:很高兴听到它适合你。我补充了一些解释。如果还有什么不清楚的地方,请告诉我。
table(combos)
# ABC ACD BCD
# 2 1 2
library(purrr)
library(dplyr)
df <- dcast(temp_df, Year ~ Rank)
distinct(df, ID = pmap_chr(select(df, num_range("", 1:3)),
~paste0(sort(c(...)), collapse="")))