簡體   English   中英

根據行和列值進行計算

[英]Calculating based on Row and Column Values

我有一個非常奇怪和復雜的問題,我甚至不確定如何描述它,但是我會盡力而為。

我正在查看點名數據。 我的數據列是立法機關的個人唱名表決。 第一行是唱名表決的政策區域(政策區域編碼為“ 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(他們收到9分),他們錯過了接下來的點名,而對於V5(他們也收到9分),他們錯過了之前的點名,呼叫。 立法者2的“或”分數的值為1,因為對於V4,他們錯過了以下分數。 對於“與”得分,立法者2將獲得值1,因為對於V5,他們錯過了之前和之后的唱名表決(例如,三個9)。 最后,第3條腿的兩個得分都將為零,這是因為當他們錯過投票時,他們對前一票和后一票都投了贊成票。

我的問題如下,R中是否有一種方法可以計算“或”分數和“與”分數? 任何幫助將不勝感激。 考慮到條件關系太多,我不確定如何繼續解決該問題。 循環最好嗎? 再次,我對此感到抱歉。

在我發表評論之后,如果您確實希望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邏輯,則應使用以下內容替換summarize函數中的or變量:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM