首页 > 解决方案 > 将许多 Stata 替换转移到 R

问题描述

.我有几千行 Stata 代码,通常旨在用来自同行的适当缺失值(将其保存为单列字符串。替换基本上如下所示,令人作呕:

replace R04_ADULTTYPE = . if (R04_ADULTTYPE <= -1 )

这些R04_是数据集中的变量,所以我希望从本质上将这些 Stata 行有效地转移到 R 中。

我已经尝试过使用它并分离/替换以轻松迭代需要替换的变量列表,但我的想法很少。如果我以字符串数据集的形式使用它们,关于如何轻松地将这些替换整体转移到 R 的任何想法?我的预期输出基本上是在 R 中进行许多 Stata 替换,我在下面的数据中给出了这些替换。

数据头部的 Dput ( rawMissing)。谢谢!

# Data (many Stata replaces
dput(head(rawMissing))
structure(list(replacements = c("replace R04_ADULTTYPE = . if (R04_ADULTTYPE <= -1 )", 
"replace R04R_A_AT0047 = . if (R04R_A_AT0047 <= -1 )", "replace R04R_A_AM0069 = . if (R04R_A_AM0069 <= -1 )", 
"replace R04R_A_AM0065_V2 = . if (R04R_A_AM0065_V2 <= -1 )", 
"replace R04_AM0066 = . if (R04_AM0066 <= -1 )", "replace R04_AM0070 = . if (R04_AM0070 <= -1 )"
)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"
))

# Expected output would be efficiently conducting these many replaces in R

标签: rreplacestatamissing-data

解决方案


我们可以extract将列名、运算符和要替换的值作为单独的列

library(dplyr)
library(tidyr)
keydat <- rawMissing %>%
     extract(replacements, into = c('colnm', 'operator', 'value'), 
         '^[^(]+\\((\\w+)\\s+([[:punct:]]+)\\s+(-?[0-9]+)')

然后,使用上述数据,通过循环“keydat”中指定的列across来循环原始数据集“df1 ”并执行这些操作acrossreplace

df2 <- df1 %>%
   mutate(across(all_of(keydat$colnm), ~ 
         {
         op <- keydat$operator[match(cur_column(), keydat$colnm)]
         val <-  keydat$value[match(cur_column(), keydat$colnm)]
         replace(., match.fun(op)(., val), NA)
        


        }))

推荐阅读