dplyr bind_rows不保留变量标签

时间:2016-01-20 01:45:57

标签: r dplyr r-haven

haven::read_dta支持使用label属性将变量标签从Stata导入R. Rstudio还支持在“视图”窗格中显示这些标签。

但是,当使用dplyr::bind_rows(或rbind_all)绑定两个数据帧时,不会保留标签。这是一个错误吗?

library(dplyr)
id <- 1:5
attr(id, "label") <- "unit id"

df1 <- tbl_df(data.frame(id)) # label is fine
df1$id
# [1] 1 2 3 4 5
# attr(,"label")
# [1] "unit id"

df2 <- tbl_df(data.frame(id)) # label is fine
df2$id
# [1] 1 2 3 4 5
# attr(,"label")
# [1] "unit id"

df_bound <- bind_rows(df1, df2) # label is gone
df_bound$id
# [1] 1 2 3 4 5 1 2 3 4 5

3 个答案:

答案 0 :(得分:1)

Daniel Lüdeckesjlabelled软件包是使用标记数据时解决此类问题的理想解决方案。我使用了copy_labels函数来解决类似的问题:

library(dplyr)  
library(sjlabelled) 
id <- 1:5  
attr(id, "label") <- "unit id"  
df1 <- tbl_df(data.frame(id))  
str(df1)   
# tibble [5 × 1] (S3: tbl_df/tbl/data.frame)  
# $ id: int [1:5] 1 2 3 4 5  
# ..- attr(*, "label")= chr "unit id"  
df2 <- tbl_df(data.frame(id)) # label is fine  
df_bound <- bind_rows(df1, df2) # label is gone  
str(df_bound)  
# tibble [10 × 1] (S3: tbl_df/tbl/data.frame)  
#  $ id: int [1:10] 1 2 3 4 5 1 2 3 4 5   

df_bound <- copy_labels(df_bound, df1)  
df_bound_labelled <- df_bound %>% mutate_at(vars(id), as_labelled)
str(df_bound_labelled)  
# tibble [10 × 1] (S3: tbl_df/tbl/data.frame)  
# $ id: int [1:10] 1 2 3 4 5 1 2 3 4 5  
#  ..- attr(*, "label")= chr "unit id"  

答案 1 :(得分:0)

一种解决方法是使用rbind而不是bind_rows。然后必须确保列名相等。

使用setdiff(names(df1), names(df2))获取df1中但不在df2中的列名,反之亦然setdiff(names(df2), names(df1))

答案 2 :(得分:-1)

sjmisc::add_rows 的语法与 dplyr::bind_rows 相似,并保留变量和值标签属性。