【问题标题】:Counting the number of pairs in a vector计算向量中的对数
【发布时间】:2015-08-09 23:32:43
【问题描述】:

假设我有以下向量:

V<-c(-1,-1,1,1,1,-1,-1,1)

我想知道以下类别中不同对的数量:

(1,1)、(-1,1)、(1,-1) 和 (-1,-1)

在我的示例中,每个都有一对。

我一直在尝试用函数splitsetkey 解决这个问题,但是我无法进行分类。

【问题讨论】:

    标签: r count duplicates categories


    【解决方案1】:
    ng <- length(V)/2
    table(sapply(split(V,rep(1:ng,each=2)),paste0,collapse="&"))
    # -1&-1  -1&1  1&-1   1&1 
    #     1     1     1     1 
    

    这是一个更好的替代方案,它也使用split,遵循@MartinMorgan 的回答模式:

    table(split(V,1:2))
    #     2
    # 1    -1 1
    #   -1  1 1
    #   1   1 1
    

    【讨论】:

    • 实际上,我认为有些东西可能不起作用。我从我的向量中取出一块,如下所示:V
    • 你说得对,我希望它是按顺序完成的,也就是说,在评估第一对、观察 1 和 2 之后,继续进行 3 和 4,依此类推。我认为您的代码通过比较非连续观察结果有所不同。
    • @juanalbertoarroyomiranda 哦,对不起,我需要在rep 中写each=2。现在它应该可以工作了。
    【解决方案2】:

    创建一个索引,该索引将重新循环以选择第一个(或取反时第二个)元素

    > idx = c(TRUE, FALSE)
    

    然后交叉制表观察的出现

    > xtabs(~V[idx] + V[!idx])
          V[!idx]
    V[idx] -1 1
        -1  1 1
        1   1 1
    

    【讨论】:

    • 我认为这是最好的方法,但对于更好的边距标签,我会使用first &lt;- V[c(TRUE,FALSE)]; second &lt;- V[c(FALSE,TRUE)]; table(first,second) 或类似的方法。
    【解决方案3】:

    或者

    table(apply(matrix(v, ncol = 2, byrow = TRUE), 1, paste, collapse = ",") )
    

    【讨论】:

    • 我只是发布了一个类似的解决方案,所以我将把它留在 cmets table(do.call(paste, as.data.frame(matrix(V, ncol = 2))))
    • 但是,有些东西可能不起作用。我认为代码没有按顺序进行分类,也就是说,在评估第一对、观察 1 和 2 之后,继续进行 3 和 4,依此类推。你有什么想法可以解决这个问题吗?
    • 嗯……我认为确实如此。该向量被格式化为一个两列矩阵,第一行为 1,2,第二行为 3, 4...确保在矩阵函数中使用byrow = TRUE
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多