R 基于数据帧向因子添加标签

R 基于数据帧向因子添加标签,r,dplyr,R,Dplyr,我有一个包含如下数字数据的数据框: data <- data.frame(q1=c("2", "1", "3"), q2=c("1", "3", "2"), other=c("other", "other", "other")) factors <- data.frame(variable=c("q1", "q1", "q1", "q2", "q2", "q2"),

我有一个包含如下数字数据的数据框:

data <- data.frame(q1=c("2", "1", "3"),
                   q2=c("1", "3", "2"),
                   other=c("other", "other", "other"))
factors <- data.frame(variable=c("q1", "q1", "q1", "q2", "q2", "q2"),
                      level=c(1,2,3,1,2,3),
                      labels=c("A", "B", "C", "X", "Y", "Z"))
我相信有一些简单的方法我没有考虑。
感谢您的帮助

一个选项是使用imap循环“q”列,根据列名称从“factors”数据集中子集“level”和“labels”列,并在factor中指定


一个选项是使用imap循环“q”列,根据列名从“factors”数据集中子集“level”和“labels”列,并在factor中指定


我试过了,但出现了一个错误:“closure”类型的对象不是subsettable@AnthonySchmidt我无法重现这个错误。你能展示一下dplyr和PURRI的软件包版本吗?我会再试一次,然后回来回复。@AnthonySchmidt我有点惊讶,因为这些都是免费的。是标准函数。不确定它在不同的版本中会有不同的行为它当然可以使用上面的示例数据,但是当修改它以引用我的真实数据时,我得到了那个错误。不过,我找到了一个解决办法。尽管如此,我仍将继续使用它,因为它要省钱得多。我试过了,但出现了一个错误:“closure”类型的对象不是subsettable@AnthonySchmidt我无法重现这个错误。你能展示一下dplyr和PURRI的软件包版本吗?我会再试一次,然后回来回复。@AnthonySchmidt我有点惊讶,因为这些都是免费的。是标准函数。不确定它在不同的版本中会有不同的行为它当然可以使用上面的示例数据,但是当修改它以引用我的真实数据时,我得到了那个错误。不过,我找到了一个解决办法。不过,我会继续使用它,因为它要省钱得多。如果您希望数据是数字,请不要在数字周围加引号!如果您希望数据是数字,请不要在数字周围加引号!
labelled <- data %>%
  mutate_at(.vars = vars(starts_with("q")),
            .funs = funs((., 
                                labels=factors$labels
                                )))
library(dplyr)
library(purrr)
data1 <- imap_dfr(data[startsWith(names(data), 'q')], ~ 
           {i1 <- factors$variable == .y
          factor(.x, levels = factors$level[i1], 
              labels = factors$labels[i1]) }) %>%
   bind_cols(., data %>% select(other))

str(data1)
#tibble [3 × 3] (S3: tbl_df/tbl/data.frame)
# $ q1   : Factor w/ 3 levels "A","B","C": 2 1 3
# $ q2   : Factor w/ 3 levels "X","Y","Z": 1 3 2
# $ other: Factor w/ 1 level "other": 1 1 1