【问题标题】:Need to create a variable based on the equality of other variables需要根据其他变量的相等性创建一个变量
【发布时间】:2019-01-30 11:40:46
【问题描述】:

我有一个名为 CSES(选举制度比较研究)的数据集,其中每一行对应一个人(民意调查中的一次采访),来自许多国家,在许多不同的年份。

我需要创建一个变量来识别每个人所投票的政党的意识形态,正如同一个人所感知的那样。

但是,该数据集通过字母 A、B、C 等来识别每个政党的这种感知意识形态(与许多其他变量一样)。然后,在识别每个人投票给哪个政党时,它有一个唯一的代码编号,这与不同年份的这些字母不对应(即,同一政党在不同年份可以有不同的字母——当然,不同国家的政党永远不会是同一个政党,因为每个国家都有自己的政党) .

帮助澄清、重现和创建代码的虚构数据:

假设:

国家 = c(1,1,1,1,2,2,2,2,3,3,3,3)

年 = c (2000,2000,2004,2004,2002,2002,2004,2008,2000,2000,2000,2000)

party_A_number = c(11,11,12,12,21,21,22,23,31,31,31,31)

party_B_number = c(12, 12, 11, 11, 22,22,21,22,32,32,32,32)

party_C_number = c(13,13,13,13,23,23,23,21,33,33,33,33)

party_voted = c(12,13,12,11,21,24,23,22,31,32,33,31)

ideology_party_A

ideology_party_B

ideology_party_C

让我们将我要创建的变量称为“ideology_voted”:

我需要类似的东西:

IF party_A_number == party_voted THEN ideology_voted = ideology_party_A

如果party_B_number == party_voted,那么 ideology_voted == ideology_party_B

如果party_C_number == party_voted,那么 ideology_voted == ideology_party_C

真实数据集有 9 个字母,代表每个国家(最多)9 个主要政党、数十个国家和选举年。因此,如果有一个代码可以迭代字母 A-I 而不是“如果投票给 A 党,那么……”,那就太好了。如果投给了乙方,那么……”

尽管如此,即使我尝试更长的重复代码(每个派对字母一个转换 - 这将给我 8 行代码),我也遇到了麻烦

【问题讨论】:

  • 您好,这个问题之前已经被问及回答过,例如这里:*.com/questions/30339765/… 请确保您在提出新问题之前仔细搜索过。
  • 感谢您的回复,但我看不出这两个问题是一回事。我正在努力弄清楚如何为我的问题翻译该代码(以及我发现的其他代码),但似乎并非如此。在您提到的问题中,只需要知道一列中的某人是母亲还是父亲(即,如果它在另一列中,则与行无关)。在我的情况下,我必须根据第三个变量,为每一列确定我应该为我的新值选择的其他六列的值是多少。
  • 没有任何数据结构很难回答这个问题,请给出一两行数据(如果不能共享实际数据,可以编造)和这些行的手动计算输出,以便人们可以更好地理解您想要计算的内容。 (这篇文章对此有很大帮助:*.com/questions/5963269/…
  • 谢谢。之前很纠结,不好意思。现在我相信这很清楚了。

标签: r


【解决方案1】:
library(tidyverse)

df <- tibble(
  country = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3),
  year = c(2000, 2000, 2004, 2004,  2002, 2002, 2004, 2008, 2000, 2000, 2000, 2000),
  party_A_number = c(11, 11, 12, 12, 21, 21, 22, 23, 31, 31, 31, 31),
  party_B_number = c(12,  12,  11,  11,  22, 22, 21, 22, 32, 32, 32, 32),
  party_C_number = c(13, 13, 13, 13, 23, 23, 23, 21, 33, 33, 33, 33),
  party_voted = c(12, 13, 12, 11, 21, 24, 23, 22, 31, 32, 33, 31),
  ideology_party_A = floor(runif (12, min = 1, max = 10)), 
  ideology_party_B = floor(runif (12, min = 1, max = 10)),
  ideology_party_C = floor(runif (12, min = 1, max = 10))
)

> df
# A tibble: 12 x 9
   country  year party_A_number party_B_number party_C_number party_voted ideology_party_A ideology_party_B
     <dbl> <dbl>          <dbl>          <dbl>          <dbl>       <dbl>            <dbl>            <dbl>
 1       1  2000             11             12             13          12                9                3
 2       1  2000             11             12             13          13                2                6
 3       1  2004             12             11             13          12                3                8
 4       1  2004             12             11             13          11                7                8
 5       2  2002             21             22             23          21                2                7
 6       2  2002             21             22             23          24                8                2
 7       2  2004             22             21             23          23                1                7
 8       2  2008             23             22             21          22                7                7
 9       3  2000             31             32             33          31                4                3
10       3  2000             31             32             33          32                7                5
11       3  2000             31             32             33          33                1                6
12       3  2000             31             32             33          31                2                1
# ... with 1 more variable: ideology_party_C <dbl>

您似乎在使用 case_when 进行调节:

ideology_voted <- df %>% transmute(
  ideology_voted = case_when(
    party_A_number == party_voted ~ ideology_party_A,
    party_B_number == party_voted ~ ideology_party_B,
    party_C_number == party_voted ~ ideology_party_C,
    TRUE                          ~ party_voted
  )
)

> ideology_voted
# A tibble: 12 x 1
   ideology_voted
            <dbl>
 1              3
 2              7
 3              3
 4              8
 5              2
 6             24
 7              8
 8              7
 9              4
10              5
11              6
12              2

请注意,case_when 的评估是惰性的,因此使用第一个 true 条件(如果碰巧有多个实际为 true,例如)。

【讨论】:

    最近更新 更多