根据行和列值计算

时间:2017-04-17 05:46:11

标签: r loops if-statement

我有一个非常奇怪和复杂的问题,我甚至不确定如何描述它,但我会尽我所能。

我在看滚动呼叫数据。我的数据列是立法机构的个人唱名表决票。第一行是滚动调用的策略区域(策略区域编码为“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中是否有办法计算“或”分数和“和”分数?任何帮助将不胜感激。考虑到有这么多的条件关系,我不确定如何处理这个问题。循环最好吗?我再次为这种困惑道歉。

1 个答案:

答案 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")