用 r 中的标签属性改变列

mutate columns with labels attributes in r

我已经从 SPSS 导入了数据,我想将一些变量转换为因子,而不必将它们全部列出。这些变量可以通过属性标签与其他变量区分开来,所以我想使用条件 length(get_labels(variable.name))>0 来改变(或者,如果不可能的话,改变为 select)它们。

使用下面的示例(尽管不是 tbl_df,如果使用 haven::read_sav 导入的话)

dt <- data.table(a = 1:4, 
                 b = factor(c(1,2,1,1), levels=1:2, labels=c("Yes","No")),
                 d = c("xxx", "yyy", "zzz", "kkk"),
                 e = factor(c(1,1,3,2), levels=1:4, labels=c("A","B","C","D")))

我试过了

但这没有用。

我怎样才能达到预期的结果,即 mutate/select 列 be

谢谢!

我建议先选择再变异。像下面这样的东西来获得所有感兴趣的列:

all_cols = colnames(dt)
focus_cols = all_cols[{logic that returns T/F for each column you want}]

然后您可以按如下方式遍历所有此类列:

for(cc in focus_cols){
  dt = mutate(dt, !!sym(cc) := as.factor(!!sym(cc)))
}

其中 !!sym(cc) 将存储在 cc 中的字符串转换为变量,而 := 等同于 = 但允许我们使用 !!sym(.)左边也是。

你可以这样做:

library(haven)
df = read_sav("iris.sav")

is.havenlab <- function(x) "haven_labelled" %in% class(x)
df %>% mutate(across(where(is.havenlab),haven::as_factor))

输入(改变 is.havenlab 列之前 df 的前三行)

# A tibble: 150 x 5
   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
          <dbl>       <dbl>        <dbl>       <dbl>  <dbl+lbl>
 1          5.1         3.5          1.4         0.2 1 [setosa]
 2          4.9         3            1.4         0.2 1 [setosa]
 3          4.7         3.2          1.3         0.2 1 [setosa]

输出(找到所有 'haven-labelled' 列并转换为因子后的前三行

# A tibble: 150 x 5
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
          <dbl>       <dbl>        <dbl>       <dbl> <fct>  
 1          5.1         3.5          1.4         0.2 setosa 
 2          4.9         3            1.4         0.2 setosa 
 3          4.7         3.2          1.3         0.2 setosa

data.table接近

这显示了另一种功能,我称之为 has.labels(这个或上面的 is.havenlab)工作正常。

df = setDT(read_sav("iris.sav"))
has.labels <- function(x) !is.null(attr(x,"labels"))
for(c in names(df)[sapply(df,has.labels)]) set(df,j=c, value = haven::as_factor(df[[c]]))