将数据集中的列表变量转换为因子

时间:2019-01-30 14:10:36

标签: r data.table

我有一个包含几个变量的数据集,这些变量是列表(var_1和var_2)。我的目标是将这些变量转换为因子变量。

数据集如下:

var_1    |   var_2
Value_1  |   Value_A
Value_2  |   Value_C
Value_3  |   Value_A
Value_43 |   Value_Z
Value_3  |   Value_A
Value_24 |   Value_Y

这是我使用typeof()函数所拥有的:

typeof(mydataset$var_1)
[1] "list"

typeof(mydataset$var_2)
[1] "list"

这是我通过str()函数得到的结果

str(mydataset)
Classes ‘data.table’ and 'data.frame':  83 obs. of  6 variables:
$ var_1 :List of 83
..$ : chr "Value_1"
..$ : chr "Value_2"
..$ : chr "Value_3"
..$ : chr "Value_43"
..$ : chr "Value_3"
..$ : chr "Value_24"
 etc...
$ var_2 :List of 83
..$ : chr "Value_A"
..$ : chr "Value_C"
..$ : chr "Value_A"
..$ : chr "Value_Z"
..$ : chr "Value_A"
..$ : chr "Value_Y"
 etc...

如何将这些变量转换为因子变量?

3 个答案:

答案 0 :(得分:1)

使用unlist

DT <- data.table(x = list("a", "b"), y = list("c", "d"))
DT[, names(DT) := lapply(.SD, function(l) factor(unlist(l)))]
str(DT)
#Classes ‘data.table’ and 'data.frame': 2 obs. of  2 variables:
#  $ x: Factor w/ 2 levels "a","b": 1 2
#  $ y: Factor w/ 2 levels "c","d": 1 2
#- attr(*, ".internal.selfref")=<externalptr> 

答案 1 :(得分:0)

我们使用mutate_all将函数应用于每个列,在其中使用map作为列本身是list元素。尚不清楚该结构是否应保持不变。如果是的话,则使用mapas.factor

library(tidyverse)
mydataset %>%
          mutate_all(funs(map(., as.factor)))

如果我们需要将其保留为普通列,请unlist并转换为factor

mydataset %>% 
         mutate_all(funs(factor(unlist(.))))

此外,从str开始,它是data.table,因此使用data.table方法

out <- mydataset[, lapply(.SD, function(x) lapply(x, factor))]
str(out)
#Classes ‘data.table’ and 'data.frame': 2 obs. of  2 variables:
# $ var_1:List of 2
#  ..$ : Factor w/ 1 level "Value_1": 1
#  ..$ : Factor w/ 1 level "Value_2": 1
# $ var_2:List of 2
#  ..$ : Factor w/ 1 level "Value_A": 1
#  ..$ : Factor w/ 1 level "Value_B": 1

数据

mydataset <- data.table(var_1 = list("Value_1", "Value_2"), 
       var_2 = list("Value_A", "Value_B"))

答案 2 :(得分:0)

尝试一下:

mydataset[[1]] <- lapply(mydataset[[1]], as.factor)