将 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 <- floor((10-0+1)*runif(1000)+0)
次要细节:10 - 0 + 1
是 11
,在 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 - 重新编码的主要内容,如果未能解决你的问题,请参考以下文章
将 SQL 值从链接数据重新编码/转换为新列:为啥 CASE WHEN 返回多个值?