dplyr加入标记列上的中断(避难所)

时间:2016-02-18 18:06:16

标签: r dplyr

如果我使用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)出错:无法加入列&f; fips&#39; X   &#39; fips&#39;:无法加入&#39; fips&#39; x&#39; fips&#39;因为类型不兼容   (数字/数字)

避免它的唯一方法似乎是删除连接变量上的标签:

df1 %>%
  mutate(fips = `attr<-`(fips, 'label', NULL)) %>% 
  inner_join(df2 %>% mutate(fips = `attr<-`(fips, 'label', NULL)))

提出了为什么首先要阅读标签的问题。 (联接也会删除df2中的标签。)

这似乎是havendplyr互动方式的错误。有更好的解决方案吗?

3 个答案:

答案 0 :(得分:0)

尝试将列转换为字符串。这似乎有效

df1$fips<-as.character(df1$fips)
df2$fips<-as.character(df2$fips)
df1 %>% inner_join(df2)

inner_join的帮助页面说明:“要加入的变量的字符向量”

答案 1 :(得分:0)

当dplyr加入一个变量时,该变量是一个数据集中的一个因子而另一个是另一个数据中的一个字符,它会发出警告但完成连接。数字和字符向量不是兼容的类,因此它会出错。通过将它们都转换为字符,连接工作正常

library(dplyr)
df1 %>% 
  mutate(fips = as.character(fips)) %>%
  inner_join(
    df2 %>%
      mutate(fips = as.character)
    )

答案 2 :(得分:0)

这在某些时候已得到修复,并且在dplyr 0.7.4中有效。我无法找到修复它的确切版本。