我有一个非常奇怪和复杂的问题,我甚至不确定如何描述它,但我会尽我所能。
我在看滚动呼叫数据。我的数据列是立法机构的个人唱名表决票。第一行是滚动调用的策略区域(策略区域编码为“R”,“G”,“W”和“B”)投票,所有剩余行表示单个立法者以及他们如何投票唱名表决。编码为9的观察表明缺少立法者。值为1表示立法者投票赞成,值2表示投票否决。
我正在尝试检查唱名表决的一部分,并确定立法者是否在战略上错过了投票。具体来说,我正在探讨立法者是否投票支持之前的唱名表决或随后的唱名表决。例如,我有以下数据:
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
Issu R G G W R G R B R G
Leg1 1 9 1 9 9 1 2 1 1 2
Leg2 9 2 1 9 9 9 1 2 1 2
Leg3 1 1 1 1 9 2 1 9 1 2
首先,我想检查所有不等于G的“Iss”或政策区域投票(如果它们被编码为R,W或B无关紧要)。
其次,我想检查所有个别立法者对这些唱名表决的投票。具体来说,我想检查他们是否错过了对非G唱名表决的投票(再次,缺少的投票被编码为9)。
接下来,我想基于所有非G滚动调用的缺失滚动调用(编码为9)创建两个分数。分数表明立法者是否也错过了之前或之后的投票(无论政策范围如何)。第一个得分是他们错过了之前的OR或者投票。第二个分数是他们在之前和之后错过投票的地方。我想为所有唱名表决加上这些分数(对于非G唱名表决)。如果某个成员没有错过非G上的点名投票,那么该单个点名将对他们的总得分贡献0。如果他们错过了单独的唱名(例如,他们收到的值为9),但是在前一次和随后的唱名表决中都存在,那么该单独的点名将对他们的得分贡献0值。
例如,在上面的例子中,我将为三位立法者提供以下两个分数
Or Score And Score
Leg1 2 0
Leg2 1 1
Leg3 0 0
立法者1对于“或”得分的值为2,因为对于V4(他们收到了9分),他们错过了以下的点名和V5(他们也获得了9分)他们错过了之前的点名。立法者2对于“或”得分的值为1,因为对于V4,他们错过了以下得分。对于“And”得分,立法者2将获得1的值,因为对于V5,他们错过了之前和之后的唱名表决(例如三个9)。最后,第3条腿将获得两个分数的零值,因为虽然他们错过了投票,但他们投票支持前一次和下一次投票。
我的问题如下,R中是否有办法计算“或”分数和“和”分数?任何帮助将不胜感激。考虑到有这么多的条件关系,我不确定如何处理这个问题。循环最好吗?我再次为这种困惑道歉。
答案 0 :(得分:0)
根据我的评论,如果您希望or
包含and
,请执行以下操作:
library(reshape2)
library(dplyr)
dat <- data.frame(vote = c(1:10), t(dat))
dat %>%
melt(measure.vars = paste0("Leg",1:3)) %>%
rename(issue = Issu, legislator = variable, result = value) %>%
filter(issue != "G") %>%
group_by(legislator) %>%
summarize(or = sum(result == 9 &
(lag(result,1) == 9 | lead(result == 9)),
na.rm = T),
and = sum(result == 9 &
lag(result,1) == 9 &
lead(result,1) == 9,
na.rm = T))
如果您想要在您的问题中表达的NAND逻辑
您应该用or
函数替换summarize
变量
以下内容:
or = sum(result == 9 &
(lag(result,1) == 9 | lead(result == 9)) &
!(result == 9 &
lag(result,1) == 9 &
lead(result,1) == 9)
第二个片段的输出将是
# A tibble: 3 × 3
legislator or and
<fctr> <int> <int>
1 Leg1 2 0
2 Leg2 1 1
3 Leg3 0 0
您的数据(请在下次发布dput
的输出)
dat <- read.table(text = " V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
Issu R G G W R G R B R G
Leg1 1 9 1 9 9 1 2 1 1 2
Leg2 9 2 1 9 9 9 1 2 1 2
Leg3 1 1 1 1 9 2 1 9 1 2")