是否有一种快速的方法可以将列中的所有变量转换为数字,而不管变量类型如何?即。如果列只有“是”和“否”的值,它们将被转换为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")
答案 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