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
答案 0 :(得分:1)
Daniel Lüdecke的sjlabelled
软件包是使用标记数据时解决此类问题的理想解决方案。我使用了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
相似,并保留变量和值标签属性。