在数据框中将因子转换为数字
convert factors to numeric in dataframe
我有一个非常大的数据框,其中包含 2 个水平的因子,水平 "No" 和 "Yes"。
我想将级别替换为数值,以便 "No" 变为 0,并且 "Yes" 变为 1.
我想应用一个适用于数据框的函数。
一个简单的工作示例:
> 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
想要的结果:
> 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
尝试
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
这可以包装到一个函数中
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)
我有一个非常大的数据框,其中包含 2 个水平的因子,水平 "No" 和 "Yes"。 我想将级别替换为数值,以便 "No" 变为 0,并且 "Yes" 变为 1.
我想应用一个适用于数据框的函数。
一个简单的工作示例:
> 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
想要的结果:
> 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
尝试
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
这可以包装到一个函数中
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)