2

haven包提供了一个非常有用的函数,用于使用 write_dta() 函数将数据框/Tibble 导出到 Stata。

当 R 因子写入 Stata 时(使用 write_dta() 函数),内部 R 因子级别变为以 Stata 长格式保存的数值,级别被写入变量标签。(这些内部 R 因子水平与应用于as.numeric(factor)因子相同。)

我想明确设置 R 的内部因子级别,以便在 Stata 中获得所需的 numlabels 值。

为了显示:

eyes <- c("blue", "brown","green", "blue", "not disclose") 
eyes_factor <- as.factor(eyes)

levels(eyes_factor)
 #[1] blue         brown        green        blue         not disclose
 #Levels: blue brown green not disclose

as.numeric(as.factor(eyes)) 
#[1] 1 2 3 1 4 # which is to be expected

但是,我想根据高度具体的模式设置 R 的内部因子水平。例如,我想要内部级别:

蓝色 = 2 棕色 = 1 绿色 = 6 不公开 = -1

因为这与问卷上的编码相匹配。

我尝试使用forcats包中的 lvls_recode。该函数如下所示:

forcats::lvls_reorder
function (f, idx, ordered = NA) 
{
    f <- check_factor(f)
    if (!is.numeric(idx)) {
        stop("`idx` must be numeric", call. = FALSE)
    }
    if (!setequal(idx, lvls_seq(f)) || length(idx) != nlevels(f)) {
        stop("`idx` must contain one integer for each level of `f`", 
            call. = FALSE)
    }
    refactor(f, levels(f)[idx], ordered = ordered)
}

但正如您在此处看到的,我需要指定的新 idx 不能,因为只采用序列号。

看了stats::relevel()也没有解决问题。

4

2 回答 2

3

如果不是-1 = disclose,你可以简单地使用类似的东西来做到这一点:

eyes2 <- factor(eyes, 
           levels = c("brown", "blue", paste0("not_used_", 1:3), "green", "not disclose"))

那正是您想要的,但not disclose不是. 一种选择是这样做,然后在 Stata 中重新编码。一个变体是强制这些值成为(例如,只是不包括“不公开”作为有效级别) - 不确定它是如何进入Stata的。7-1not discloseNA

R 因子不能将 -1 作为基础代码之一。所以我认为没有任何简单的方法可以解决这个问题。你必须自己重新编码,制作一个查找表。例如:

eye_codes <- data.frame(code = c(-1, 1, 2, 6),
                        level = c("not disclose", "brown", "blue", "green"),
                        stringsAsFactors = FALSE)

library(dplyr)
eyes3 <-left_join(data.frame(eyes), eye_codes, by = c("eyes" = "level"))

eyes3

这让你:

          eyes code
1         blue    2
2        brown    1
3        green    6
4         blue    2
5 not disclose   -1

代码列就是你想要的。注意我使用dplyr::left_join而不是merge更容易控制结果排序的行为。

这当然有点痛苦。我,我会将 R 中的数据保存为与平台无关的字符文本(根本不是因素,这似乎有太多风险),然后如果您需要它们在 Stata 中以特定方式显式编码,请重新编码在斯塔。

于 2018-01-27T23:17:35.200 回答
0

您可以设置一个查找表并选择正确的值。

NewEyes = as.numeric(as.factor(eyes)) 
Replacements = c(2,1,6,-1)
Replacements[NewEyes]
[1]  2  1  6  2 -1
于 2018-01-27T23:19:20.960 回答