关于 r:将因子转换为数据框中的数字

convert factors to numeric in dataframe

我有一个非常大的数据框,其中包含 2 个级别的因子,级别"否"和"是"。
我想将级别替换为数值,以便 "No" 变为 0,而 "Yes" 变为 1。

我想应用一个适用于数据框的函数。

一个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
> df
  a   b   c   d
1 1  No Yes   1
2 2  No  No   3
3 3 Yes  No 123
4 4 Yes Yes  12
5 5  No Yes 231
6 6  No  No  21
7 7 Yes  No  21
8 8 Yes  No  21

> str(df)
'data.frame':   8 obs. of  4 variables:
 $ a: int  1 2 3 4 5 6 7 8
 $ b: Factor w/ 2 levels"No","Yes": 1 1 2 2 1 1 2 2
 $ c: Factor w/ 2 levels"No","Yes": 2 1 1 2 2 1 1 1
 $ d: int  1 3 123 12 231 21 21 21

想要的结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
> df
  a b c   d
1 1 0 1   1
2 2 0 0   3
3 3 1 0 123
4 4 1 1  12
5 5 0 1 231
6 6 0 0  21
7 7 1 0  21

> str(df)
'data.frame':   8 obs. of  4 variables:
 $ a: int  1 2 3 4 5 6 7 8
 $ b: int  0 0 1 1 0 0 1 1
 $ c: int  1 0 0 1 1 0 0 0
 $ d: int  1 3 123 12 231 21 21 21


试试

1
2
3
4
5
6
7
8
9
10
11
df[2:3] <- lapply(df[2:3], function(x) as.numeric(x)-1)
df
#   a b c   d
#1 1 0 1   1
#2 2 0 0   3
#3 3 1 0 123
#4 4 1 1  12
#5 5 0 1 231
#6 6 0 0  21
#7 7 1 0  21
#8 8 1 0  21

这可以被package成一个函数

1
2
3
4
5
6
7
8
f1 <- function(dat){
 indx <- sapply(dat, is.factor)
 dat[indx] <- lapply(dat[indx], function(x) if(any(x %in% c("Yes",
            "No"))) as.numeric(x)-1 else x)
 dat
}

f1(df)