2017-04-17 163 views
0

我有一個非常奇怪而複雜的問題,我甚至不知道如何描述它,但我會盡我所能。根據行和列值進行計算

我正在查看分卷數據。我的數據欄是立法機構的個人唱名錶決票。第一行是唱名策略區域(政策區域編碼爲「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

回答

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)) 

如果你想,你在你的問題表達 則應更換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