簡體   English   中英

更改R中的內部因子水平(對於避風港很重要-write_dta())

[英]Changing internal factor levels in R (important for haven - write_dta())

所述haven包提供了一個非常有用的功能使用write_dta()函數導出的數據幀/向Tibble Stata的。

當將R因子寫入Stata(使用write_dta()函數)時,內部R因子級別變為以Stata long格式保存的數值,並且該級別被寫入變量標簽。 (這些內部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包中的forcats 該函數如下所示:

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()也無法解決問題。

如果不是-1 = disclose ,您可以使用以下類似的方法簡單地做到這一點:

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

那正是您想要但not disclose7而不是-1 一種選擇是采用這種方式,然后在Stata中重新編碼。 一種變體將迫使那些not disclose值的人為NA (例如,僅通過不包括“不公開”作為有效水平)-不確定這如何影響到Stata。

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中以特定方式對它們進行顯式編碼,請進行重新編碼在斯塔塔。

您可以只設置一個查詢表並選擇正確的值。

NewEyes = as.numeric(as.factor(eyes)) 
Replacements = c(2,1,6,-1)
Replacements[NewEyes]
[1]  2  1  6  2 -1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM