一次将多个列强制转换为因子

问题描述 投票:52回答:7

我有一个如下所示的示例数据框:

data <- data.frame(matrix(sample(1:40), 4, 10, dimnames = list(1:4, LETTERS[1:10])))

我想知道如何选择多个列并将它们一起转换为因子。我通常像data$A = as.factor(data$A)那样做。但是当数据框非常大并且包含大量列时,这种方式将非常耗时。有谁知道更好的方法吗?

r dataframe r-factor
7个回答
90
投票

选择一些列来强制使用因子:

cols <- c("A", "C", "D", "H")

使用lapply()强制替换所选列:

data[cols] <- lapply(data[cols], factor)  ## as.factor() could also be used

检查结果:

sapply(data, class)
#        A         B         C         D         E         F         G 
# "factor" "integer"  "factor"  "factor" "integer" "integer" "integer" 
#        H         I         J 
# "factor" "integer" "integer" 

28
投票

这是一个使用dplyr的选项。来自%<>%magrittr运算符用结果值更新lhs对象。

library(magrittr)
library(dplyr)
cols <- c("A", "C", "D", "H")

data %<>%
       mutate_each_(funs(factor(.)),cols)
str(data)
#'data.frame':  4 obs. of  10 variables:
# $ A: Factor w/ 4 levels "23","24","26",..: 1 2 3 4
# $ B: int  15 13 39 16
# $ C: Factor w/ 4 levels "3","5","18","37": 2 1 3 4
# $ D: Factor w/ 4 levels "2","6","28","38": 3 1 4 2
# $ E: int  14 4 22 20
# $ F: int  7 19 36 27
# $ G: int  35 40 21 10
# $ H: Factor w/ 4 levels "11","29","32",..: 1 4 3 2
# $ I: int  17 1 9 25
# $ J: int  12 30 8 33

或者,如果我们使用data.table,使用for循环与set

setDT(data)
for(j in cols){
  set(data, i=NULL, j=j, value=factor(data[[j]]))
}

或者我们可以在.SDcols中指定'cols'并将rhs指定为(colsxswpoi)'cols'

:=

19
投票

最近的setDT(data)[, (cols):= lapply(.SD, factor), .SDcols=cols] 方式是使用tidyverse函数:

mutate_at

5
投票

而且,为了完整性和library(tidyverse) library(magrittr) set.seed(88) data <- data.frame(matrix(sample(1:40), 4, 10, dimnames = list(1:4, LETTERS[1:10]))) cols <- c("A", "C", "D", "H") data %<>% mutate_at(cols, funs(factor(.))) str(data) $ A: Factor w/ 4 levels "5","17","18",..: 2 1 4 3 $ B: int 36 35 2 26 $ C: Factor w/ 4 levels "22","31","32",..: 1 2 4 3 $ D: Factor w/ 4 levels "1","9","16","39": 3 4 1 2 $ E: int 3 14 30 38 $ F: int 27 15 28 37 $ G: int 19 11 6 21 $ H: Factor w/ 4 levels "7","12","20",..: 1 3 4 2 $ I: int 23 24 13 8 $ J: int 10 25 4 33 ,有this question asking about changing string columns only

mutate_if

1
投票

你可以使用data <- cbind(stringVar = sample(c("foo","bar"),10,replace=TRUE), data.frame(matrix(sample(1:40), 10, 10, dimnames = list(1:10, LETTERS[1:10]))),stringsAsFactors=FALSE) factoredData = data %>% mutate_if(is.character,funs(factor(.))) mutate_if):

例如,在dplyr强制integer

factor

使用功能:

mydata=structure(list(a = 1:10, b = 1:10, c = c("a", "a", "b", "b", 
"c", "c", "c", "c", "c", "c")), row.names = c(NA, -10L), class = c("tbl_df", 
"tbl", "data.frame"))

# A tibble: 10 x 3
       a     b c    
   <int> <int> <chr>
 1     1     1 a    
 2     2     2 a    
 3     3     3 b    
 4     4     4 b    
 5     5     5 c    
 6     6     6 c    
 7     7     7 c    
 8     8     8 c    
 9     9     9 c    
10    10    10 c   

0
投票

如果您有另一个目标是从表中获取值然后使用它们进行转换,您可以尝试以下方式

library(dplyr)

mydata%>%
    mutate_if(is.integer,as.factor)

# A tibble: 10 x 3
       a     b c    
   <fct> <fct> <chr>
 1     1     1 a    
 2     2     2 a    
 3     3     3 b    
 4     4     4 b    
 5     5     5 c    
 6     6     6 c    
 7     7     7 c    
 8     8     8 c    
 9     9     9 c    
10    10    10 c    

这将选择特定于字符的列,然后将它们转换为因子。


0
投票

这是一个### pre processing ind <- bigm.train[,lapply(.SD,is.character)] ind <- names(ind[,.SD[T]]) ### Convert multiple columns to factor bigm.train[,(ind):=lapply(.SD,factor),.SDcols=ind] 的例子。我在这个例子中使用了data.table,因为我经常通过对其名称使用部分匹配来选择许多列。

grep
© www.soinside.com 2019 - 2024. All rights reserved.