将数据框中的所有变量转换为数字

时间:2017-09-18 17:22:27

标签: r

是否有一种快速的方法可以将列中的所有变量转换为数字,而不管变量类型如何?即。如果列只有“是”和“否”的值,它们将被转换为0和1;具有3个值“a”,“b”和“c”的列将被转换为0,1,2等。

我正在使用的当前df将第9列设为“是/否”。

编辑:

使用Moody_Mudskipper的建议,我尝试过:

RawData1 <- as.matrix(as.numeric(factor(RawData[[9]], levels = c("Yes","No"))) - 1)

dput(head(df,10))
structure(c("function (x, df1, df2, ncp, log = FALSE) ", "{", 
"    if (missing(ncp)) ", "        .Call(C_df, x, df1, df2, log)", 
"    else .Call(C_dnf, x, df1, df2, ncp, log)", "}"), .Dim = c(6L, 
1L), .Dimnames = list(c("1", "2", "3", "4", "5", "6"), ""), class = 
"noquote")

3 个答案:

答案 0 :(得分:1)

您可以使用factors

df <- data.frame(yn = sample(c("yes","no"),10,T),
                 abc = sample(c("a","b","c"),10,T),
                 stringsAsFactors = F
                 )

df$yn2 <- as.numeric(factor(df$yn,levels = c("yes","no"))) - 1
df$abc2 <- as.numeric(factor(df$abc,levels = c("a","b","c"))) - 1

#     yn abc yn2 abc2
# 1   no   b   1    1
# 2  yes   b   0    1
# 3   no   b   1    1
# 4  yes   a   0    0
# 5  yes   c   0    2
# 6  yes   c   0    2
# 7  yes   c   0    2
# 8  yes   a   0    0
# 9   no   c   1    2
# 10 yes   b   0    1

答案 1 :(得分:0)

穆迪的回答(+1)解释说你需要转换为因子,然后转换为数字

您可以使用mutate_all更改数据框中所有列的类

library(dplyr)
df %>% 
   mutate_all(funs(as.numeric(as.factor(.))))

答案 2 :(得分:0)

转换所有列的另一个Base R解决方案:

# Added a numeric column to @Moody_Mudskipper's data example
set.seed(1)
df <- data.frame(yn = sample(c("yes","no"),10,T),
                 abc = sample(c("a","b","c"),10,T),
                 num = 1:10,
                 stringsAsFactors = F
)

df = data.frame(lapply(df, function(x) as.numeric(as.factor(x))))

这个问题的一个问题是它给出了:

   yn abc num
1   2   1   1
2   2   1   2
3   1   3   3
4   1   2   4
5   2   3   5
6   1   2   6
7   1   3   7
8   1   3   8
9   1   2   9
10  2   3  10

这不是OP想要的,因为他希望将因子/字符变量转换为0,1,2,3,......可以尝试这样做:

df = data.frame(lapply(df, function(x) as.numeric(as.factor(x))-1))

但是然后所有数字列都会被错误地减去1 ...使用mutate_all(如@ CPak的回答中)有同样的问题。您可以做的是使用mutate_if仅转换因子/字符的列:

library(dplyr)
df %>%
  mutate_if(function(x) is.factor(x) | is.character(x), funs(as.numeric(as.factor(.))-1))

# or this...
df %>%
  mutate_if(function(x) !is.numeric(x), funs(as.numeric(as.factor(.))-1))

现在,列已正确转换:

   yn abc num
1   1   0   1
2   1   0   2
3   0   2   3
4   0   1   4
5   1   2   5
6   0   1   6
7   0   2   7
8   0   2   8
9   0   1   9
10  1   2  10