![](/img/trans.png)
[英]"Error in validate_dta_label(label)" when using haven 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 disclose
是7
而不是-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.