【问题标题】:Keeping column labels when using the select function with dplyr将 select 函数与 dplyr 一起使用时保留列标签
【发布时间】:2019-08-07 13:18:28
【问题描述】:

我正在组合几个数据集并仅保留特定列,但是,当我使用 dplyr 中的 select 函数时,它不会保留原始列标签(在我的情况下,项目文本)。

导入数据后,我使用以下代码选择要保留的变量:

Wave1Data_Clean <- select(Wave1Data, ID, x1, x2, x3, x4, x5)

当我这样做时,列名和值一样正确,但是,列标签会替换为原始数据框的标签。例如,如果原始数据中第 1 列的标签是“位置”,则 df 中 ID 的列名称将是“位置”,而不是与 ID 关联的标签。

有没有办法保留适当的列标签?

【问题讨论】:

  • 如果您使用诸如 Haven 之类的包来读取数据,您是否指的是像元数据这样的标签(例如 SPSS 标签),它们会存储为列属性?
  • 是的,我正在导入以“项目文本”为标签的 .sav 文件。这就是我想要保留的。
  • @akrun 这是一个小例子。使用这个filelibrary(dplyr) setwd("~/Desktop/") Example &lt;- read.spss("Example.sav",use.value.label=FALSE, to.data.frame=TRUE) Example_Clean &lt;- select(Example, ID, X1, X2, X3, X4,X5)你会看到新df中的标签保留了原始df的顺序
  • @ClaudiuPapasteri - 抱歉,之前没有标记你

标签: r dplyr


【解决方案1】:

当我在 RStudio 中查看数据框时,我可以看到您描述的问题。

Example_Clean in RStudio

我不确定为什么标签会混淆,但您可以用正确的标签覆盖它们。

假设您使用的是foreign 包中的read.spss,标签存储为名为“variable.labels”的属性。您可以使用以下方式访问标签:

attr(Example_Clean, "variable.labels")

以下代码用正确的标签覆盖标签。

var_labs <- attr(Example_Clean, "variable.labels")
var_labs <- var_labs[names(Example_Clean)]
attr(Example_Clean, "variable.labels") <- var_labs

【讨论】:

    【解决方案2】:

    在当前版本的 dplyr (1.0.5) 中,使用dplyr::select() 时属性“variable.labels”完全丢失。似乎存储列标签的更好方法是将属性与向量本身相关联,而不是与整个数据帧相关联,这就是 Haven 包中的函数所做的。使用haven::read_sav() 作为替代方案将在转换数据时保留标签。

    这是一个可重复的比较:

    library(foreign)
    # import example SAV from foreign
    sav <- system.file("files", "electric.sav", package = "foreign")
    dat_for <- read.spss(file = sav, to.data.frame = TRUE)
    
    # labels are saved as a variable.labels attribute for the whole dataframe
    str(dat_for)
    #> 'data.frame':    240 obs. of  13 variables:
    #>  $ CASEID  : num  13 30 53 84 89 102 117 132 151 153 ...
    #>  $ FIRSTCHD: Factor w/ 5 levels "NO CHD","SUDDEN  DEATH",..: 3 3 2 3 2 3 3 3 2 2 ...
    #>  $ AGE     : num  40 49 43 50 43 50 45 47 53 49 ...
    #>  $ DBP58   : num  70 87 89 105 110 88 70 79 102 99 ...
    #>  $ EDUYR   : num  16 11 12 8 NA 8 NA 9 12 14 ...
    #>  $ CHOL58  : num  321 246 262 275 301 261 212 372 216 251 ...
    #>  $ CGT58   : num  0 60 0 15 25 30 0 30 0 10 ...
    #>  $ HT58    : num  68.8 72.2 69 62.5 68 68 66.5 67 67 64.3 ...
    #>  $ WT58    : num  190 204 162 152 148 142 196 193 172 162 ...
    #>  $ DAYOFWK : Factor w/ 7 levels "SUNDAY","MONDAY",..: NA 5 7 4 2 1 NA 1 3 5 ...
    #>  $ VITAL10 : Factor w/ 2 levels "ALIVE","DEAD": 1 1 2 1 2 2 1 1 2 2 ...
    #>  $ FAMHXCVR: Factor w/ 2 levels "NO","YES": 2 1 1 2 1 1 1 1 1 2 ...
    #>  $ CHD     : num  1 1 1 1 1 1 1 1 1 1 ...
    #>  - attr(*, "variable.labels")= Named chr [1:13] "CASE IDENTIFICATION NUMBER" "FIRST CHD EVENT" "AGE AT ENTRY" "AVERAGE DIAST BLOOD PRESSURE 58" ...
    #>   ..- attr(*, "names")= chr [1:13] "CASEID" "FIRSTCHD" "AGE" "DBP58" ...
    
    # dplyr::select() loses the variable.labels attribute:
    library(dplyr, warn.conflicts = FALSE)
    dat_for %>% select(1:2) %>% str()
    #> 'data.frame':    240 obs. of  2 variables:
    #>  $ CASEID  : num  13 30 53 84 89 102 117 132 151 153 ...
    #>  $ FIRSTCHD: Factor w/ 5 levels "NO CHD","SUDDEN  DEATH",..: 3 3 2 3 2 3 3 3 2 2 ...
    
    # but to be fair, base slicing also loses the attribute:
    dat_for[,1:2] %>% str()
    #> 'data.frame':    240 obs. of  2 variables:
    #>  $ CASEID  : num  13 30 53 84 89 102 117 132 151 153 ...
    #>  $ FIRSTCHD: Factor w/ 5 levels "NO CHD","SUDDEN  DEATH",..: 3 3 2 3 2 3 3 3 2 2 ...
    
    # import same file with haven
    library(haven)
    dat_hav <- read_sav(file = sav)
    
    # labels are attributes of columns
    str(dat_hav$CASEID)
    #>  num [1:240] 13 30 53 84 89 102 117 132 151 153 ...
    #>  - attr(*, "label")= chr "CASE IDENTIFICATION NUMBER"
    #>  - attr(*, "format.spss")= chr "F4.0"
    #>  - attr(*, "display_width")= int 0
    
    # dplyr::select() keeps them
    dat_hav %>% select(1:2) %>% str()
    #> tibble[,2] [240 × 2] (S3: tbl_df/tbl/data.frame)
    #>  $ CASEID  : num [1:240] 13 30 53 84 89 102 117 132 151 153 ...
    #>   ..- attr(*, "label")= chr "CASE IDENTIFICATION NUMBER"
    #>   ..- attr(*, "format.spss")= chr "F4.0"
    #>   ..- attr(*, "display_width")= int 0
    #>  $ FIRSTCHD: dbl+lbl [1:240] 3, 3, 2, 3, 2, 3, 3, 3, 2, 2, 6, 2, 3, 5, 3, 3, 3, 3, ...
    #>    ..@ label        : chr "FIRST CHD EVENT"
    #>    ..@ format.spss  : chr "F1.0"
    #>    ..@ display_width: int 0
    #>    ..@ labels       : Named num [1:5] 1 2 3 5 6
    #>    .. ..- attr(*, "names")= chr [1:5] "NO CHD" "SUDDEN  DEATH" "NONFATALMI" "FATAL   MI" ...
    #>  - attr(*, "label")= chr "                       SPSS/PC+"
    

    reprex package (v1.0.0) 于 2021-03-30 创建

    【讨论】:

      猜你喜欢
      • 2021-07-20
      • 1970-01-01
      • 1970-01-01
      • 2018-09-20
      • 2018-09-21
      • 1970-01-01
      • 2021-12-28
      • 2014-08-03
      • 1970-01-01
      相关资源
      最近更新 更多