【问题标题】:Calculating based on Row and Column Values基于行值和列值计算
【发布时间】:2017-04-17 05:46:10
【问题描述】:

我有一个非常奇怪和复杂的问题,我什至不知道如何描述它,但我会尽力而为。

我正在查看点名数据。我的数据列是对立法机关的个人唱名投票。第一行是唱名投票的政策领域(政策领域被编码为“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)创建两个分数。分数表明立法者是否也错过了之前或之后的投票(无论政策领域如何)。第一个分数是他们是否错过了之前或之后的投票。第二个分数是他们在之前和之后错过投票的地方。我想为所有唱名投票(非 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)。最后,Leg 3 的两个分数都将获得零值,因为虽然他们错过了选票,但他们投票支持了前一票和后一票。

我的问题如下,R中有没有办法计算“或”分数和“与”分数?任何帮助将不胜感激。考虑到有这么多的条件关系,我什至不确定如何继续解决这个问题。循环最好吗?再次,我为造成的混乱道歉。

【问题讨论】:

  • 听起来像是一个家庭作业问题,我想我在 SO 上看到过类似的问题。建议您先搜索。
  • 立法者 2 是否应该得到 OR 得分,因为他错过了 V5,但也错过了 V4 或 V6?如果不是,这会使布尔逻辑复杂化。 AND 应该自动算作 OR。
  • 是的,你是正确的立法者 2 应该得到 OR 分数。非常感谢! (顺便说一句,不,这不是家庭作业)。

标签: r loops if-statement


【解决方案1】:

按照我的评论,如果您确实希望 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)

第二个sn-p的输出将是

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

【讨论】:

  • 非常感谢。这就是我需要的!
  • 不客气@Dyllan。如果答案是值得的,我们总是会感谢您的支持。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多