dplyr bind_行不保留变量标签

dplyr bind_行不保留变量标签,r,dplyr,r-haven,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

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
库(dplyr)

id解决方法是使用
rbind
而不是
bind\u行
。然后必须确保列名相等


使用
setdiff(names(df1),names(df2))
获取列名称,这些列名称位于
df1
中,但不在
df2
中,而
setdiff(names(df2),names(df1))
反之亦然。

sjlabeled
包是处理标记数据时解决此类问题的好方法。我对类似问题使用了
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"  
库(dplyr)
图书馆(带标签)

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

我编辑它是因为不清楚您在说什么。有趣的问题。表示“所有函数现在都应该将列属性从输入复制到输出…”以防万一,我尝试了使用devel版本的
dplyr
,即
0.4.3.9000
,但两者都不起作用。虽然此链接可以回答这个问题,最好在这里包括答案的基本部分,并提供链接供参考。如果链接页面发生更改,则仅链接的答案可能无效-