R -apply-将许多列从数字转换为因子

时间:2015-12-07 00:05:18

标签: r class apply

我需要将许多数字列转换为因子类型。 示例表:

df <- data.frame(A=1:10, B=2:11, C=3:12)

我尝试了申请:

cols<-c('A', 'B')
df[,cols]<-apply(df[,cols], 2, function(x){ as.factor(x)});

但结果是一个角色类。

> class(df$A)
[1] "character"

如果不为每列执行as.factor,我该怎么做?

6 个答案:

答案 0 :(得分:7)

尝试

df[,cols] <- lapply(df[,cols],as.factor)

问题是apply()尝试将结果绑定到矩阵中,这会导致列强制转换为字符:

class(apply(df[,cols], 2, as.factor))  ## matrix
class(as.factor(df[,1]))  ## factor

相反,lapply()对列表元素进行操作。

答案 1 :(得分:4)

2017年11月9日更新

purrr / purrrlyr仍处于开发阶段

与Ben相似,但使用purrrlyr::dmap_at

library(purrrlyr)

df <- data.frame(A=1:10, B=2:11, C=3:12)

# selected cols to factor
cols <- c('A', 'B')

(dmap_at(df, factor, .at = cols))

A        B       C
<fctr>   <fctr>  <int>
1        2       3      
2        3       4      
3        4       5      
4        5       6      
5        6       7      
6        7       8      
7        8       9      
8        9       10     
9        10      11     
10       11      12 

答案 2 :(得分:3)

您可以将结果放回数据框中,以识别因素:

df[,cols]<-data.frame(apply(df[,cols], 2, function(x){ as.factor(x)}))

答案 3 :(得分:1)

使用dplyrdf <- data.frame(A=1:10, B=2:11, C=3:12) str(df) 'data.frame': 10 obs. of 3 variables: $ A: int 1 2 3 4 5 6 7 8 9 10 $ B: int 2 3 4 5 6 7 8 9 10 11 $ C: int 3 4 5 6 7 8 9 10 11 12 的另一个选项,可能比基本解决方案更具可读性,并将数据保存在数据框中:

以下是数据:

dmap

我们可以使用library(purrr) library(dplyr) # all cols to factor dmap(df, as.factor) Source: local data frame [10 x 3] A B C (fctr) (fctr) (fctr) 1 1 2 3 2 2 3 4 3 3 4 5 4 4 5 6 5 5 6 7 6 6 7 8 7 7 8 9 8 8 9 10 9 9 10 11 10 10 11 12 轻松操作所有列:

dmap

同样使用来自select的{​​{1}}对列的子集使用dplyr

# selected cols to factor
cols <- c('A', 'B')

df[,cols] <- 
  df %>% 
  select(one_of(cols)) %>% 
  dmap(as.factor)

获得所需的结果:

str(df)
'data.frame':   10 obs. of  3 variables:
 $ A: Factor w/ 10 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10
 $ B: Factor w/ 10 levels "2","3","4","5",..: 1 2 3 4 5 6 7 8 9 10
 $ C: int  3 4 5 6 7 8 9 10 11 12

答案 4 :(得分:0)

一个简单但有效的选择是mapply

df <- data.frame(A=1:10, B=2:11, C=3:12)
cols <- c('A', 'B')

df[,cols] <- as.data.frame(mapply(as.factor,df[,cols]))

您还可以使用for循环获得相同的结果:

for(col in cols){
  df[,col] <- as.factor(df[,col])
}

答案 5 :(得分:0)

这里有几个 tidyverse 选项 -

library(dplyr)

cols <- c('A', 'B')

df <- df %>% mutate(across(all_of(cols), factor)) 

str(df)

#'data.frame':  10 obs. of  3 variables:
# $ A: Factor w/ 10 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10
# $ B: Factor w/ 10 levels "2","3","4","5",..: 1 2 3 4 5 6 7 8 9 10
# $ C: int  3 4 5 6 7 8 9 10 11 12

使用 map -

df[cols] <- purrr::map(df[cols], factor)