用 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")))
我试过了
dt %>% mutate_at(vars(length(get_labels(.))>0), haven::as_factor)
dt %>% mutate_if((length(get_labels(.))>0), haven::as_factor)
但这没有用。
我怎样才能达到预期的结果,即 mutate/select 列 b
和 e
?
谢谢!
我建议先选择再变异。像下面这样的东西来获得所有感兴趣的列:
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]]))
我已经从 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")))
我试过了
dt %>% mutate_at(vars(length(get_labels(.))>0), haven::as_factor)
dt %>% mutate_if((length(get_labels(.))>0), haven::as_factor)
但这没有用。
我怎样才能达到预期的结果,即 mutate/select 列 b
和 e
?
谢谢!
我建议先选择再变异。像下面这样的东西来获得所有感兴趣的列:
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]]))