2014-12-26 58 views
2

我想知道如何將多個列與單列中的值進行比較,然後使用這些匹配來創建差異表。我有一個政策結果的政治數據集,以及某些組織是否支持或反對這些結果。這裏有一些模擬數據:R - 比較多個列並創建指示匹配的新列

結果0意味着法律從未發生,結果1意味着它發生了。 對於組織而言,負數表示他們反對他們支持它的法律和積極的手段:

set.seed(123) 
Data <- data.frame(
    year = sample(1998:2004, 200, replace = TRUE), 
    outcome = sample(0:1, 200, replace = TRUE), 
    union = sample(-1:1, 200, replace = TRUE), 
    chamber = sample(-1:1, 200, replace = TRUE), 
    pharma = sample(-1:1, 200, replace = TRUE), 
    gun = sample(-1:1, 200, replace = TRUE), 
    dem = sample(-1:1, 200, replace = TRUE), 
    repub = sample(-1:1, 200, replace = TRUE) 
) 

我想知道一個組織多少次匹配每年支持或工會的反對。

我想象它的將是一些像這樣的表,其中匹配等於1,否則爲-1(也有數據許多結果:NAS組織採取任何位置):

DATA$contra <- ifelse(DATA$union == page.bin$chamber, 1, -1) 

在DataSet ,大約有50個組織連續列。創建50個新的列,每個匹配一個似乎很難。即使這是最好的方法,我也不知道如何應用這個函數來創建50個新列。

最後,我想創建一個熱圖或一種方式來可視化哪些組織匹配union列。但是,首先,我想我需要某種數據表。

感謝您的幫助!

+0

根據實際的數據是什麼樣子,你可以先重塑DF爲長格式,例如,你有一個變量「組織」,那麼你可以總結數據,按年份和組織分組,並使用例如如果別的。 – beetroot

+0

建議您將問題編輯爲a)使用set.seed()使其具有可重現性,並且b)使您的示例名稱保持一致。 –

回答

0

也許下面的幫助。首先,創建一個包含每個組織,每個行支持是否匹配工會新的數據幀:

match.union <- data.frame(year=Data$year, 
        lapply(Data[,4:ncol(Data)],function(col) col==Data$union)) 

與當年添加列下一步,這是總結是非常重要的協議每年工會數量:

aggregate(.~year,match.union,sum) 

我從這個得到的輸出是

year chamber pharma gun dem repub 
1 1998  11  9 10 9  7 
2 1999  10  8 16 9 14 
3 2000  8  9 8 7 12 
4 2001  7  9 10 9 13 
5 2002  11  12 11 13  8 
6 2003  5  7 8 5  6 
7 2004  13  13 15 15 10 
3

當你說「我想知道,組織了多少次匹配工會的支持或反對,每年。「那麼我假設你想要達成協議的網絡數量,即發生1/1投票或-1/-1投票配對,並從中減去分歧的數量,而不關心數量次的票一個爲0

運行你的代碼我用set.seed(123)之前,因此有可能會重現:

> head(Data) 
    year outcome union chamber pharma gun dem repub 
1 2000  0  1  -1  0 -1 1 -1 
2 2003  1 -1  1  0 0 1 -1 
3 2000  1  1  -1  -1 -1 0 -1 
4 2004  1  0  -1  -1 1 1  0 
5 2004  0  0  -1  -1 1 0 -1 
6 1998  1  0  1  1 0 1  1 

> head(Data[-(1:3)] * Data[[3]]) 
    chamber pharma gun dem repub 
1  -1  0 -1 1 -1 
2  -1  0 0 -1  1 
3  -1  -1 -1 0 -1 
4  0  0 0 0  0 
5  0  0 0 0  0 
6  0  0 0 0  0 

這使得1/1和1/-1配對全部爲==1和-1/1和1/-1配對==-1和其他==0。現在,人們可以通過一年彙總此:

> head(aggregate(Data[-(1:3)] * Data[[3]], Data[1], sum)) 
    year chamber pharma gun dem repub 
1 1998  0  -2 1 2  6 
2 1999  0  0 2 4  3 
3 2000  -3  2 -3 -4 -11 
4 2001  2  3 2 9  1 
5 2002  0  -1 7 9  1 
6 2003  0  -2 -11 5 -2 

相反,如果你只是想只有協議的總和將是:

> aggregate(Data[-(1:3)] * Data[[3]], Data[1], function(x) {sum(x==1)}) 
    year chamber pharma gun dem repub 
1 1998  5  4 5 7  9 
2 1999  8  7 7 9  9 
3 2000  5  8 5 3  3 
4 2001  7  9 7 11  4 
5 2002  7  6 11 12  9 
6 2003  7  5 1 8  5 
7 2004  4  4 9 2  4 
3

使用dplyr

library(dplyr) 

Data %>% 
    select(-outcome) %>% 
    group_by(year, union) %>% 
    mutate_each(funs(union * .)) %>% 
    group_by(year) %>% 
    summarise_each(funs(sum(. == 1)), -union) 

你得到:

Source: local data frame [7 x 6] 

    year chamber pharma gun dem repub 
1 1998  5  4 5 7  9 
2 1999  8  7 7 9  9 
3 2000  5  8 5 3  3 
4 2001  7  9 7 11  4 
5 2002  7  6 11 12  9 
6 2003  7  5 1 8  5 
7 2004  4  4 9 2  4 

運用tidyrgather()在一個高大的格式來獲取數據和ggvis熱圖

library(dplyr) 
library(tidyr) 
library(ggvis) 

Data %>% 
    select(-outcome) %>% 
    group_by(year, union) %>% 
    mutate_each(funs(union * .)) %>% 
    group_by(year) %>% 
    summarise_each(funs(sum(. == 1)), -union) %>% 
    gather(org, value, -year) %>% 
    mutate(org = as.factor(org), year = as.factor(year)) %>% 
    ggvis(~year, ~org, fill=~value) %>% 
    layer_rects(width = band(), height = band()) %>% 
    layer_text(
    x = prop("x", ~year, scale = "xcenter"), 
    y = prop("y", ~org, scale = "ycenter"), 
    text:=~value, fontSize := 14, fill:="white", 
    baseline:="middle", align:="center") %>% 
    scale_nominal("x", padding = 0, points = FALSE) %>% 
    scale_nominal("y", padding = 0, points = FALSE) %>% 
    scale_nominal("x", name = "xcenter", padding = 1, points = TRUE) %>% 
    scale_nominal("y", name = "ycenter", padding = 1, points = TRUE) %>% 
    hide_legend("fill") 

enter image description here

相關問題