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) |