根据行和列值进行计算

问题描述:

我有一个非常奇怪而复杂的问题,我甚至不知道如何描述它,但我会尽我所能。根据行和列值进行计算

我正在查看分卷数据。我的数据栏是立法机构的个人唱名表决票。第一行是唱名策略区域(政策区域编码为“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(如果它们被编码为R,W或B不要紧)。

第二,我想检查所有个人立法者对这些唱名表决的投票。具体而言,我想检查他们是否错过了对非G唱名表决的投票(再次,缺少投票编码为9)。

接下来,我想创建两个分数,基于所有非G滚动呼叫的丢失呼叫(编码为9)。评分表明立法者是否也错过了之前或之后的投票(不管政策领域如何)。第一个分数是如果他们错过了之前或之后的投票。第二个分数是他们在之前和之后错过投票的地方。我想为所有唱名表决增加这些分数(对于非G唱名表决)。如果一个会员没有错过非G的唱名表决,那么该个人唱名会为他们的总分赋予一个0的值。如果他们错过了个人唱名呼叫(例如,他们收到了9的值),但是对于之前和之后的唱名表决都存在,那么该单独唱名将对他们的分数贡献值0。

例如,在上面的例子中,我将有以下两个分数为三个立法者

 Or Score And Score 
Leg1 2   0 
Leg2 1   1 
Leg3 0   0 

立委1将得到的2值的“或”得分因为V4(它们因为他们错过了接下来的点名,而V5(他们也收到了9)因此错过了之前的点名。立法者2的“或”分值为1,因为V4他们错过了以下分数。对于“And”分数,立法者2的价值为1,因为V5他们错过了之前和之后的唱名表决(例如三个9)。最后,第3回合的得分将为零,因为他们错过了投票,他们投票赞成之前和之后的投票。

我的问题是以下内容,R中有计算“Or”分数还是“And”分数的方法?任何帮助将不胜感激。考虑到有这么多的条件关系,我不知道如何解决这个问题。一个循环是最好的?再次,我对这种混乱表示歉意。

+0

听起来像是一门功课的问题,我想我已经看到了类似的问题对SO。建议您先搜索。 –

+0

立法者2不应该因为他错过了V5而获得OR得分,但是也错过了V4或V6?否则,这会使布尔逻辑复杂化。 AND应自动计为OR。 – shayaa

+0

是的,你是正确的立法者2应该得到OR分数。非常感谢! (顺便说一下,不,这不是作业)。 – Dyllan

按照我的意见,如果你想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)) 

如果你想,你在你的问题表达 则应更换or变量在NAND逻辑所述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") 
+0

非常感谢。这是我需要的! – Dyllan

+0

不客气@Dyllan。如果答案是值得的,总是会赞赏upvote。 – shayaa