【发布时间】:2016-05-31 01:43:37
【问题描述】:
如果我使用 haven 读取带有标签的 Stata 或 SAS 数据集,它将(至少在 haven 0.2.0 中)以以下格式读取:
library(dplyr)
df1 <- data_frame(fips = structure(c(1001, 1001, 1001, 1001, 1001),
label = "FIPS (numeric)"),
id = structure(letters[1:5], label = "ID"))
df2 <- data_frame(fips = structure(c(1001, 1003, 1005, 1007, 1009),
label = "FIPS (numeric)"),
state = structure("AL", label = "State Abbreviation"))
(如有必要,我可以发布一些生成此数据的 Stata 数据,但这应该很容易使用任何标记的 Stata/SAS 数据集进行验证。)
当我尝试使用任何 dplyr 连接函数来连接带标签的列时,我感到非常失望:
df1 %>% inner_join(df2)
返回错误
eval 中的错误(expr,envir,enclos):无法加入列 'fips' x 'fips':由于类型不兼容,无法加入 'fips' x 'fips' (数字/数字)
避免它的唯一方法似乎是删除连接变量上的标签:
df1 %>%
mutate(fips = `attr<-`(fips, 'label', NULL)) %>%
inner_join(df2 %>% mutate(fips = `attr<-`(fips, 'label', NULL)))
这提出了为什么首先要阅读标签的问题。 (连接也消除了df2 中的标签。)
这似乎是haven 和dplyr 交互方式的错误。有没有更好的解决方案?
【问题讨论】:
-
更准确地说,这不是
dplyr与结构交互的问题吗,因为它可以在不使用haven的情况下重现?