【问题标题】:How to create a (integer or numeric) variable based on a second one, but conditioned to many AND & OR conditions on third variables如何基于第二个变量创建(整数或数字)变量,但以第三个变量的许多 AND & OR 条件为条件
【发布时间】:2019-12-23 21:08:30
【问题描述】:

我只是一个小本科生,我为我的愚蠢问题道歉,但我真的无法复制我在互联网上找到的一篇文章。 该代码在 Stata 中可用,但在 R 中不可用。

这里是Stata代码,每一行都是第三个变量满足我的条件,所以我要创建的只是导入第二个变量的值。

gen child_care_basic = tuactdur24 if
(tutier1code==3 & tutier2code ==1 & tutier3code==1) |   

[...]

我在 R 中尝试的是:

timeuse_2003$CHILD_CARE_BASIC <- NA
timeuse_2003$CHILD_CARE_BASIC[(timeuse_2003$TUTIER1CODE==3 & timeuse_2003$TUTIER2CODE==1 & timeuse_2003$TUTIER3CODE==1) |
                          (timeuse_2003$TUTIER1CODE==3 & timeuse_2003$TUTIER2CODE==1 & timeuse_2003$TUTIER3CODE==1) |
                          (timeuse_2003$TUTIER1CODE==3 & timeuse_2003$TUTIER2CODE==1 & timeuse_2003$TUTIER3CODE==8) |
                          (timeuse_2003$TUTIER1CODE==3 & timeuse_2003$TUTIER2CODE==1 & timeuse_2003$TUTIER3CODE==9) |
                          (timeuse_2003$TUTIER1CODE==3 & timeuse_2003$TUTIER2CODE==1 & timeuse_2003$TUTIER3CODE==10) |
                          (timeuse_2003$TUTIER1CODE==3 & timeuse_2003$TUTIER2CODE==1 & timeuse_2003$TUTIER3CODE==11) |
                          (timeuse_2003$TUTIER1CODE==3 & timeuse_2003$TUTIER2CODE==1 & timeuse_2003$TUTIER3CODE==12) |
                          (timeuse_2003$TUTIER1CODE==3 & timeuse_2003$TUTIER2CODE==1 & timeuse_2003$TUTIER3CODE==99) |
                          (timeuse_2003$TUTIER1CODE==3 & timeuse_2003$TUTIER2CODE==3) |
                          (timeuse_2003$TUTIER1CODE==4 & timeuse_2003$TUTIER2CODE==1 & timeuse_2003$TUTIER3CODE==1) |
                          (timeuse_2003$TUTIER1CODE==4 & timeuse_2003$TUTIER2CODE==1 & timeuse_2003$TUTIER3CODE==8) |
                          (timeuse_2003$TUTIER1CODE==4 & timeuse_2003$TUTIER2CODE==1 & timeuse_2003$TUTIER3CODE==9) |
                          (timeuse_2003$TUTIER1CODE==4 & timeuse_2003$TUTIER2CODE==1 & timeuse_2003$TUTIER3CODE==10) |
                          (timeuse_2003$TUTIER1CODE==4 & timeuse_2003$TUTIER2CODE==1 & timeuse_2003$TUTIER3CODE==10) |
                          (timeuse_2003$TUTIER1CODE==4 & timeuse_2003$TUTIER2CODE==1 & timeuse_2003$TUTIER3CODE==10) |
                          (timeuse_2003$TUTIER1CODE==4 & timeuse_2003$TUTIER2CODE==1 & timeuse_2003$TUTIER3CODE==10) |
                          (timeuse_2003$TUTIER1CODE==4 & timeuse_2003$TUTIER2CODE==3 & timeuse_2003$TUTIER3CODE==10) |
                          (timeuse_2003$TUTIER1CODE==17 & timeuse_2003$TUTIER2CODE==3 & timeuse_2003$TUTIER3CODE==10) |
                          (timeuse_2003$TUTIER1CODE==17 & timeuse_2003$TUTIER2CODE==4 & timeuse_2003$TUTIER3CODE==10) |
                          (timeuse_2003$TUTIER1CODE==17 & timeuse_2003$TUTIER2CODE==4 & timeuse_2003$TUTIER3CODE==1)
                          ]<- timeuse_2003$TUACTDUR24 

问题是,我在整个专栏中只得到了 NA。

再次,对于这样一个基本问题,我深表歉意,但我只是尝试了很多不同的方法,但没有任何效果,所以我决定从我的初学者的盒子里问你们。

提前谢谢你。

法布里西奥

【问题讨论】:

  • 我很好奇你为什么用 R 中的 != 替换了 Stata 中的 == 运算符。你不希望发生相反的情况吗?也许您可以给我们一个小数据样本,并向我们展示预期的行为。同时显示您的代码以及您收到的错误消息或错误结果。
  • 嗨大手指,谢谢。这实际上是我试图实施的一种解决方法。首先,我通过复制第二个变量来创建变量。然后我想用 NA 抑制一些值,这些值与第三个变量的条件不匹配。我重新编辑了问题以使其整洁。我收到一条错误消息:命令根本没有运行:错误:意外']' in: (timeuse_2003$TUTIER1CODE!=4 & timeuse_2003$TUTIER2CODE!=1 & timeuse_2003$TUTIER3CODE!=10) | (timeuse_2003$TUTIER1CODE!=4 & timeuse_2003$TUTIER2CODE!=3 & timeuse_2003$TUTIER3CODE!=10))]"
  • ps。我看过很多关于如何根据条件创建变量的帖子,但它们返回逻辑值。我希望使用第二个值而不是 TRUE 或 FALSE 创建我的变量。谢谢。
  • 同样,发布您运行的实际代码和收到的错误消息会有所帮助。您在评论中描述的错误与您在问题中发布的代码不匹配。例如,错误提到 timeuse_2003$TUTIER1CODE!=4。您在问题的 R 代码中没有值 4。错误消息表明括号不匹配,但如果没有看到您的实际代码,就不可能知道它发生在哪里。
  • 感谢您的指导,BigFinger。现在我刚刚复制了整个代码和错误消息。我想从你那里知道代码是否有意义,考虑到我的目的:从第二个变量创建一个新变量,给定第三个变量的(许多 AND/OR)条件。你能给我举个例子吗?所以我可以尝试推导出一个替代方案。我的目的是通过这种复制来流利地使用 R。

标签: r variables multiple-conditions


【解决方案1】:

您可以按照以下模式根据您的业务逻辑创建一个包含值子集的新列。

timeuse_2003 = data.frame(
    TUACTDUR24 = c(10.1, 20.2, 30.3, 40.4, 50.5),
    TUTIER1CODE = c(3, 4, 3, 4, 3),
    TUTIER2CODE = c(1, 1, 1, 3, 3))

timeuse_2003

  TUACTDUR24 TUTIER1CODE TUTIER2CODE
1       10.1           3           1
2       20.2           4           1
3       30.3           3           1
4       40.4           4           3
5       50.5           3           3

selection = timeuse_2003$TUTIER1CODE==3 & timeuse_2003$TUTIER2CODE==1
timeuse_2003$CHILD_CARE_BASIC = NA
timeuse_2003$CHILD_CARE_BASIC[selection] = timeuse_2003$TUACTDUR24[selection]

timeuse_2003

  TUACTDUR24 TUTIER1CODE TUTIER2CODE CHILD_CARE_BASIC
1       10.1           3           1             10.1
2       20.2           4           1               NA
3       30.3           3           1             30.3
4       40.4           4           3               NA
5       50.5           3           3               NA

【讨论】:

  • 效果很好。非常感谢您的耐心和努力。一旦我们走到这一步,我想问你“你不应该子选择然后分配给另一列。行数将不匹配”是什么意思。以及为什么您的解决方案在作业的两边都有条件(CHILD_CARE_BASIC 和 TUACTDUR24)?
  • 我很高兴我们能够解决这个问题。对于您的问题:在上面的示例中, timeuse_2003$TUACTDUR24[selection] 是一个包含 2 个元素的向量。如果您指定 timeuse_2003$CHILD_CARE_BASIC = timeuse_2003$TUACTDUR24[selection],则您将 2 个元素的向量分配给具有 5 个元素的向量。尽管 R 很乐意允许它,但它不会给你预期的结果。如果您在分配的两边都进行相同的选择,例如 timeuse_2003$CHILD_CARE_BASIC[selection] = timeuse_2003$TUACTDUR24[selection],那么这些值将被分配到正确的索引位置。
  • 我明白了。感谢您分享您的知识!
猜你喜欢
  • 2022-01-08
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 2021-09-28
  • 2021-06-17
  • 1970-01-01
  • 2018-02-16
  • 2013-10-31
相关资源
最近更新 更多