我想知道如何将多个列与单个列中的值进行比较,然后使用这些匹配来创建差异表。我有一个政策结果的政治数据集,以及某些组织是否支持或反对这些结果。这是一些模拟数据:
结果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列匹配的方法。但是,首先,我认为,我需要某种数据表。
感谢您的帮助!
答案 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")
答案 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