如何将Hmisc提取的列标签匹配应用到列数不同的DataFrame?
问题描述
我有类似需求,通过以下代码从带标签的DataFrame提取列标签:
library(data.table) library(haven) library(Hmisc) library(foreign) df <- fread("A B C 1 2 3") label(df$A) <- "Variable label for variable A" label(df$B) <- "Variable label for variable B" label(df$C) <- "Variable label for variable C" Lbl <- setNames(stack(lapply(df, label))[2:1], c("Varcode", "Variables")) # Remove labels df <- df |> zap_labels() |> zap_formats()
原本用这段代码给列数相同的df2重新应用标签:
# set labels for (i in seq_len(nrow(Lbl))) { Hmisc::label(df2[[Lbl$Varcode[i]]]) <- Lbl$Variables[i] }
但现在需要给列数不同的df2(如下)仅匹配存在的列设置标签:
df2 <- fread("A B D C E 1 2 2 3 1")
原代码无法适配,需要编写匹配逻辑实现仅为df2中存在的列设置对应标签。
解决方案
只需要先筛选出Lbl中存在于df2列名的记录,再循环赋值即可:
# 筛选df2中存在的列对应的标签 matched_lbl <- Lbl[Lbl$Varcode %in% colnames(df2), ] # 仅为匹配到的列设置标签 for (i in seq_len(nrow(matched_lbl))) { Hmisc::label(df2[[matched_lbl$Varcode[i]]]) <- matched_lbl$Variables[i] }
可以验证效果:
# 查看df2的列标签 sapply(df2, label)
输出结果:
A B D C E "Variable label for variable A" "Variable label for variable B" "" "Variable label for variable C" ""
这样只会给df2中存在的A、B、C列设置对应标签,D和E列保持无标签状态。
另外也可以用更简洁的写法,直接遍历df2的列名匹配赋值:
for (col in colnames(df2)) { lbl <- Lbl$Variables[Lbl$Varcode == col] if (length(lbl) > 0) { Hmisc::label(df2[[col]]) <- lbl } }
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

