R - 比较多列并创建指示匹配的新列

时间:2014-12-26 18:20:31

标签: 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(数据中也有很多NA,组织没有位置):

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

在数据集中,连续列中约有50个组织。创建50个新列似乎不实用,每个匹配一个。即使这是最好的方法,我也不知道如何应用该函数来创建50个新列。

最后,我想创建一个热图或一种可视化哪些组织与union列匹配的方法。但是,首先,我认为,我需要某种数据表。

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

当你说&#34;我想知道一个组织每年多少次与工会的支持或反对相匹配。&#34;然后我假设你想要协议的净数量,即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

答案 1 :(得分: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

使用gather()中的tidyr获取高格式数据和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

答案 2 :(得分: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