如何比较两列中的一对与r中数据帧的另一对列

时间:2016-03-02 06:01:47

标签: r

我有一个数据框。我想比较两列的对和另外两列的对。每次列对的比较应基于将列1:2的条目与第2列的条目进行比较:1。如果这两个列对匹配,那么我希望频率计数与该对列相加。

z <- c(3,3,2)
y <- c(1,2,3)
x <- data.frame(y,z)
library(plyr)
fr <- count(x[,1:2])
fr
# The matched pair of 1:2 with 2:1
fr[3,1:2] == fr[2,2:1]

我想要的输出是包含匹配对的频率总和的数据帧。

  y z freq
1 1 3    1
2 2 3    2

1 个答案:

答案 0 :(得分:2)

我们可以使用base R执行此操作。我们通过更改&#39; x&#39;来transform数据集。最小值为&#39; y&#39;和&#39; z&#39;对于每一行(使用pmin),&#39; z&#39;最大值为&#39; y&#39;和&#39; z&#39;对于每一行(使用pmax),创建一个新列的频率&#39; freq&#39;以1为值。然后,使用xtabs获取&#39;频率的sum。由&#39; x&#39;并且&#39; y&#39; (默认情况下,xtabs获取sum),并转换为data.frameas.data.frame)。

 as.data.frame(xtabs(freq~., transform(x, y= pmin(y,z),
               z= pmax(y,z), freq=1)))
 #  y z Freq
 #1 1 3    1
 #2 2 3    2

或者另一种选择是使用applyMARGIN=1使用sort元素和aggregate循环使用sum的行,以便将x[] <- t(apply(x, 1, sort)) aggregate(Freq~., transform(x, Freq=1), sum) # y z Freq #1 1 3 1 #2 2 3 2 分组为&# 39; Y&#39;和&#39; z&#39;

function createChart() {
    $("#chart").kendoChart({
        title: {
            position: "bottom",
            text: "Share of Internet Population Growth, 2007 - 2012"
        },
        legend: { visible: false },
        chartArea: { background: "" },
        seriesDefaults: {
            labels: {
                visible: true, background: "transparent", template: "#= category #: \n #= value#%"
            }
        },
        series: [{
            type: "pie",
            overlay: { gradient: "none" },
            startAngle: 150,
            data: [{ category: "Asia", value: 53.8, color: "#9de219" },
                { category: "Europe", value: 16.1, color: "#90cc38" },
                { category: "Latin America", value: 11.3, color: "#068c35" },
                { category: "Africa", value: 9.6, color: "#006634" },
                { category: "Middle East", value: 5.2, color: "#004d38" },
                { category: "North America", value: 3.6, color: "#033939" }]
        }],
        tooltip: { visible: true, format: "{0}%" }
    });
}

$(document).ready(createChart);