【问题标题】:Finding unique tuples in R but ignoring order在 R 中查找唯一元组但忽略顺序
【发布时间】:2015-05-19 17:39:08
【问题描述】:

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

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

我还需要这些“独特”事件的计数

还有两件事。首先,我的值是字符串,我需要将它们保留为字符串。 其次,如果可能的话,我会在 year 和 1 之间设置一个名为 Weighting 的列,然后在计算这些独特组合时,我会包括每个组合的权重。这并不那么重要,因为所有的权重都是小的正整数值,所以我可能会更早地复制行以考虑权重,然后将唯一的对制成表格。

【问题讨论】:

标签: r unique


【解决方案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" 

对于数据框的每一行,第 1、2 和 3 列中的值(如帖子中的标记)使用sort 排序,然后使用paste0 连接。由于顺序无关紧要,这可以确保相同的案例被一致地标记。

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

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

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

【讨论】:

  • 这很好用,你能带我看一下paste0(sort(x), collapse = "")吗,因为这当然不是我的真实数据,而且数据字符串要长得多。我知道 paste 是什么,但不知道 paste0,collapse 是否也会删除名称之间的引号?
  • @qwertylpc:很高兴听到它对你有用。我添加了一些解释。如果还有什么不清楚的,请告诉我。
【解决方案2】:

这与@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="")))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 2020-06-21
    • 2016-08-13
    • 2023-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多