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
,但两者都不起作用。虽然此链接可以回答这个问题,最好在这里包括答案的基本部分,并提供链接供参考。如果链接页面发生更改,则仅链接的答案可能无效-