将字符列转换为因子保留列标签

时间:2019-06-17 22:52:45

标签: r r-haven

我有一个从XLSX文件读取的数据框。每个列名称如下所示:CODE___DESCRIPTION,例如, A1 ___此处有些时髦的列。将代码用作名称比较容易,但是我想在需要时使用描述,因此必须将其存储在数据框中。这就是为什么我以后要使用 sjlabelled 包的原因。

给自己一些随机数据,并将其另存为 some_data.xlsx

library(dplyr) #to play with tibbles
library(stringi) #to play with strings
library(writexl) #name speaks for itself

tibble(col1 = sample(c("a", "b", "c", NA, "N/A"), 50, replace = T),
       col2 = sample(c("d", "e", "f", NA, "N/A"), 50, replace = T),
       col3 = sample(c("g", "h", "i", NA, "N/A"), 50, replace = T),
       col4 = sample(c("j", "k", "l", NA, "N/A"), 50, replace = T)) %>%
  setNames(stri_c("A", 1:4, "___", stri_rand_strings(4, 10))) %>%
  write_xlsx(path = "some_data.xlsx", col_names = T, format_headers = F)

我已经创建了简单的函数来按照自己的方式准备数据。

library(sjlabelled) #to play with labelled data

label_it <- function(data = NULL, split = "___"){

#This basically makes an array of two columns (of codes and descriptions respectively)

  k.n <- data %>%
    names() %>%
    stri_split_fixed(pattern = split, simplify = T)

  data%>%
    set_label(k.n[,2]) %>% #set description as each column's label
    setNames(k.n[,1]) #set code as each column's name

}

首先,我从XLSX文件读取数据。然后我贴上标签。

library(readxl) #name speaks for itself again

data <- read_xlsx("some_data.xlsx", na = c("", "N/A")) %>% 
   label_it()

现在我数据框的每一列都是具有两个属性的字符向量(实际上是一个结构):

  • 标签是说明部分
  • 名称是原始数据框列名称(CODE___DESCRIPTION样式),请勿将其误认为是将作为代码部分的名称(数据)输出

假设我想将第一列和第三列更改为要分解的内容。

为此,我尝试了两件事:

data[,1] <- factor(data[,1], levels = c("c", "a", "b"))
data[,3] <- factor(data[,3], levels = c("h", "g", "i"))

这会将所有这两个列的值都更改为NA_integer _。

data <- data %>%
  mutate(A1 = factor(A1, levels = c("c", "a", "b")),
         A3 = factor(A3, levels = c("h", "g", "i")))

这会将字符向量更改为预期的因子,但同时删除了我需要保留的列属性(标签和名称)。

我还尝试了 sjlabelled labelled haven 软件包中的很多功能。我没有按预期工作。最后,我找到了一个解决方案,但这并不是完美的解决方案,我希望找到一种更简单的方法。

解决方案是丢失这些属性,然后重新获得(实际上是“复制”)它们。

data <- data %>%
  mutate(A1 = factor(A1, levels = c("c", "a", "b")),
         A3 = factor(A3, levels = c("h", "g", "i"))) %>%
  copy_labels(data)

copy_labels sjlabelled 包中的函数,当由于例如以下原因而丢失标签时使用该函数。数据子集,如this example

P.S。 我很想添加 r-sjlabelled r-labelled 标签,因为在这些问题中考虑了这些软件包,但这样做的声誉低于1500。

0 个答案:

没有答案