【问题标题】:Translating Stata to R and having some is.na troubles将 Stata 翻译成 R 并遇到一些 is.na 问题
【发布时间】:2022-01-08 14:33:30
【问题描述】:

我正在将 Stata 代码翻译成 R 代码,但现在我遇到了一些类似这样的问题。

这是我的 Stata 代码:

gen     aposentadofam=1 if proprendaposent  > 0 & proprendaposent ~=.;
replace aposentadofam=0 if proprendaposent == 0 | proprendaposent ==.;

这就是我在 R 中尝试做的事情:

# pemg <- mutate(pemg, aposentadofam = NA_real_)
  # pemg <- mutate(pemg, aposentadofam = case_when(proprendaposent >0 & !is.na(proprendaposent) ~ 1, TRUE ~ aposentadofam))
  # pemg <- mutate(pemg, aposentadofam = case_when(proprendaposent==0 | is.na(proprendaposent) ~ 0, TRUE ~ aposentadofam))

is.na() 的行似乎运行正常,但!is.na() 的行却没有。它给了我这个错误信息:

LHS of case 1 (`proprendaposent > 0 & !is.na(proprendaposent) ~ 1`) must be a logical vector, not a `formula` object.

我该怎么办?

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。
  • 给出的代码不是惯用的Stata。您冗长的变量名称无疑是信息丰富且适合您的情况,但是为了专注于原则,让我们使用更短的名称。 gen wanted = foo &gt; 0 &amp; foo != . 表格可以让您一举两得。尽管它可能不会在您的上下文中咬人,但您的代码也会将扩展的缺失值 .a 映射到 .z 到 0。 gen wanted = foo &gt; 0 &amp; !missing(foo) 也可以。我在那里复制 foo 永远不会消极的含义。尽管此评论完全是关于 Stata 风格,但我怀疑您是否有义务在 R 中使用两行。
  • 感谢您的反馈!这个 Stata 代码不是我的,所以 !missing() 是我不能用太多的东西。而这双代码行会通过代码重复多次,所以...

标签: r stata na


【解决方案1】:

没有足够的声誉来发表评论(还没有!),但我只是使用您的示例代码(在 R 中)运行了以下内容,没有任何问题。您的数据/代码究竟有何不同?

library(dplyr)

pemg <- data.frame(c(1, 2, 3.1, 4, 5.5, 0, 0, 0, NA))
colnames(pemg) <- "proprendaposent"

pemg <- mutate(pemg, aposentadofam = NA_real_)
pemg <- mutate(pemg, aposentadofam = case_when(proprendaposent >0 & !is.na(proprendaposent) ~ 1, TRUE ~ aposentadofam))
pemg <- mutate(pemg, aposentadofam = case_when(proprendaposent==0 | is.na(proprendaposent) ~ 0, TRUE ~ aposentadofam))
pemg

哪个输出:

  proprendaposent aposentadofam
1             1.0             1
2             2.0             1
3             3.1             1
4             4.0             1
5             5.5             1
6             0.0             0
7             0.0             0
8             0.0             0
9              NA             0

【讨论】:

    【解决方案2】:

    within() 通常是最能说明问题的。

    dat <- within(dat, {
      aposentadofam <- NA
      aposentadofam[proprendaposent > 0 & !is.na(proprendaposent)] <- 1
      aposentadofam[proprendaposent == 0 | is.na(proprendaposent)] <- 0
    })
    

    或者使用transform()

    dat <- transform(dat, aposentadofam=ifelse(proprendaposent %in% c(0, NA), 0, 1))
    

    这两个函数都带有基本 R,因此您不需要任何额外的包(无论如何这种情况很少见)。

    #    proprendaposent aposentadofam
    # 1                0             0
    # 2                4             1
    # 3                0             0
    # 4                0             0
    # 5                1             1
    # 6                3             1
    # 7                1             1
    # 8                1             1
    # 9                0             0
    # 10              NA             0
    # 11              NA             0
    # 12               3             1
    

    数据

    dat <- structure(list(proprendaposent = c(0L, 4L, 0L, 0L, 1L, 3L, 1L, 
    1L, 0L, NA, NA, 3L)), class = "data.frame", row.names = c(NA, 
    -12L))
    

    【讨论】:

      猜你喜欢
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      • 2022-11-30
      • 2020-02-08
      • 2017-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多