将 Stata 转换为 R - 重新编码

Posted

技术标签:

【中文标题】将 Stata 转换为 R - 重新编码【英文标题】:Translating Stata to R - recoding 【发布时间】:2016-08-29 14:49:13 【问题描述】:

我正在尝试从 Stata 翻译以下内容

clear
set obs 1000
generate y = floor((10-0+1)*runiform() +0)
recode y (7=0) (8=0) (9=1) (10=2)

我以为我有以下代码:

library(dplyr)
mydata <- y ~ floor((10-0+1)*runif(1000)+0)
recode (mydata, '7'=0, '8'=0, '9'=1, '10'=2)

但是,最后一行总是给我一个错误:

UseMethod("recode") 中的错误:没有适用于“recode”的适用方法应用于“公式”类的对象。

有什么想法吗?

【问题讨论】:

试试mydata &lt;- floor((10-0+1)*runif(1000)+0) 次要细节:10 - 0 + 111,在 Stata 和 R 中总是如此。同样,添加 0 是没有用的。在这两种情况下,如果这些都是朝着更普遍的方向迈出的一步,那很好,但这一点都不明显。 【参考方案1】:

你可以使用cut:

n = 1000L
y = cut(runif(n, 0, 11), c(-Inf, 9, 10, Inf), right = FALSE, ordered = TRUE)

您可以看到它是如何与table 一起工作的:

# y
#  [-Inf,9)    [9,10) [10, Inf) 
#       813        91        96

如果你真的想要这些代码,你可以使用as.integer(y)-1L。阅读 ?cut?factor 了解 R 中序数数据的更多详细信息。


到目前为止,我一直假设重新编码规则有一些押韵或理由。如果没有,最好将其存储在单独的表中并从那里提取值(这与我在 Stata 中所做的相同):

rec = data.frame(old = c(7,8,9,10), new = c(0,0,1,2))

n  = 1000L
y  = floor(runif(n, 0, 11))
DF = data.frame(id = 1:10, y)

library(data.table)
setDT(DF)

DF[rec, on=c(y = "old"), y := new]
DF[, .N, keyby=y]

#    y   N
# 1: 0 288
# 2: 1 179
# 3: 2 174
# 4: 3 101
# 5: 4  82
# 6: 5  93
# 7: 6  83

不过,您需要安装 data.table 包才能使其正常工作。

【讨论】:

很酷的答案,@Frank,但知道如何仅使用 base R?Thxs 执行重新编码 谢谢@ÁlvaroA.Gutiérrez-Vargas 我认为涉及match 函数的东西会起作用,也许m = match(DF$y, rec$old); DF$y = ifelse(is.na(m), DF$y, rec$new[m]) 您也可以发布赏金以查看其他人是否有更好的答案***.com/help/bounty

以上是关于将 Stata 转换为 R - 重新编码的主要内容,如果未能解决你的问题,请参考以下文章

将Stata代码翻译成R

不使用Stata软件将dta文件转换为csv

将 SQL 值从链接数据重新编码/转换为新列:为啥 CASE WHEN 返回多个值?

R或Java:是不是有将邮政编码转换为纬度和经度并放在地图上的包?

如何将Matlab中的数值型变量转换成字符型变量

使用 R 转换文件编码? (ANSI 到 UTF-8)