将数据类从数字更改为数据框中许多列的因子

什么是最快/最好的方法来将大量的列从数字变成数字?

我用下面的代码,但似乎已经重新sorting我的数据。

> head(stats[,1:2]) rk team 1 1 Washington Capitals* 2 2 San Jose Sharks* 3 3 Chicago Blackhawks* 4 4 Phoenix Coyotes* 5 5 New Jersey Devils* 6 6 Vancouver Canucks* for(i in c(1,3:ncol(stats))) { stats[,i] <- as.numeric(stats[,i]) } > head(stats[,1:2]) rk team 1 2 Washington Capitals* 2 13 San Jose Sharks* 3 24 Chicago Blackhawks* 4 26 Phoenix Coyotes* 5 27 New Jersey Devils* 6 28 Vancouver Canucks* 

什么是最好的方法,没有命名每一列如下:

 df$colname <- as.numeric(ds$colname) 

除Ramnath的回答之外,您遇到的行为是由于as.numeric(x)返回R级别的因子x的内部数字表示forms。 如果要保留因子(而不是内部表示)级别的数字,则需要按照Ramnath的示例通过as.character()首先转换为字符。

您的for循环与apply调用一样合理,对于代码的意图可能会稍微更易读。 只要改变这一行:

 stats[,i] <- as.numeric(stats[,i]) 

读书

 stats[,i] <- as.numeric(as.character(stats[,i])) 

这是R FAQ中的FAQ 7.10 。

HTH

在将因素更改为数字时必须小心。 这里有一行代码会将一组列从一个因子改变为数字。 我在这里假设要更改为数字的列分别是1,3,4和5,您可以相应地更改它

 cols = c(1, 3, 4, 5); df[,cols] = apply(df[,cols], 2, function(x) as.numeric(as.character(x)); 

这可以在一行中完成,不需要循环,无论是循环还是应用。 使用unlist()代替:

 # testdata Df <- data.frame( x = as.factor(sample(1:5,30,r=T)), y = as.factor(sample(1:5,30,r=T)), z = as.factor(sample(1:5,30,r=T)), w = as.factor(sample(1:5,30,r=T)) ) ## Df[,c("y","w")] <- as.numeric(as.character(unlist(Df[,c("y","w")]))) str(Df) 

编辑:为您的代码,这成为:

 id <- c(1,3:ncol(stats))) stats[,id] <- as.numeric(as.character(unlist(stats[,id]))) 

显然,如果你有一列数据框架,并且你不希望R的自动drop=FALSE维将其转换为向量,则必须添加drop=FALSE参数。

我知道这个问题已经解决了很长时间,但是我最近遇到了一个类似的问题,我觉得我已经find了一个更加优雅和function性的解决scheme,尽pipe它需要magrittr包。

 library(magrittr) cols = c(1, 3, 4, 5) df[,cols] %<>% lapply(function(x) as.numeric(as.character(x)) 

%<>%运算符pipe道重新分配,这对于简化数据清理和转换非常有用。 现在,列表应用函数更容易阅读,只需指定您希望应用的函数。

我认为ucfagls发现你的循环不工作的原因。

如果你仍然不想使用循环这里是lapply解决scheme:

 factorToNumeric <- function(f) as.numeric(levels(f))[as.integer(f)] cols <- c(1, 3:ncol(stats)) stats[cols] <- lapply(stats[cols], factorToNumeric) 

编辑。 我发现更简单的解决scheme。 看来, as.matrix转换为字符。 所以

 stats[cols] <- as.numeric(as.matrix(stats[cols])) 

应该做你想做的。

lapply几乎是为此而devise的

 unfactorize<-c("colA","colB") df[,unfactorize]<-lapply(unfactorize, function(x) as.numeric(as.character(df[,x]))) 

使用apply()调用时,我遇到了将所有列转换为数字的问题:

 apply(data, 2, as.numeric) 

问题原来是因为某些string中有一个逗号 – 例如“1,024.63”而不是“1024.63” – 而R不喜欢这种格式化数字的方式。 所以我删除它们,然后运行as.numeric()

 data = as.data.frame(apply(data, 2, function(x) { y = str_replace_all(x, ",", "") #remove commas return(as.numeric(y)) #then convert })) 

请注意,这需要加载stringr包。

我想指出的是,如果你在任何栏目中都有NAs,那么简单地使用下标就行不通了。 如果因素中有NAs,则必须使用Ramnath提供的应用脚本。

例如

 Df <- data.frame( x = c(NA,as.factor(sample(1:5,30,r=T))), y = c(NA,as.factor(sample(1:5,30,r=T))), z = c(NA,as.factor(sample(1:5,30,r=T))), w = c(NA,as.factor(sample(1:5,30,r=T))) ) Df[,c(1:4)] <- as.numeric(as.character(Df[,c(1:4)])) 

返回以下内容:

 Warning message: NAs introduced by coercion > head(Df) xyzw 1 NA NA NA NA 2 NA NA NA NA 3 NA NA NA NA 4 NA NA NA NA 5 NA NA NA NA 6 NA NA NA NA 

但:

 Df[,c(1:4)]= apply(Df[,c(1:4)], 2, function(x) as.numeric(as.character(x))) 

返回:

 > head(Df) xyzw 1 NA NA NA NA 2 2 3 4 1 3 1 5 3 4 4 2 3 4 1 5 5 3 5 5 6 4 2 4 4 

这就是我的工作。 apply()函数试图将df强制转换为matrix,并返回NA。

numeric.df <- as.data.frame(sapply(df, 2, as.numeric))

我在其他重复线程上find了这个函数,并且发现它是解决这个问题的一种优雅而通用的方法。 这个主题首先显示在这个主题上的大多数search,所以我在这里分享,以节省人们一些时间。 我不记得这一点,所以看到原来的post在这里和这里的细节。

 df <- data.frame(x = 1:10, y = rep(1:2, 5), k = rnorm(10, 5,2), z = rep(c(2010, 2012, 2011, 2010, 1999), 2), j = c(rep(c("a", "b", "c"), 3), "d")) convert.magic <- function(obj, type){ FUN1 <- switch(type, character = as.character, numeric = as.numeric, factor = as.factor) out <- lapply(obj, FUN1) as.data.frame(out) } str(df) str(convert.magic(df, "character")) str(convert.magic(df, "factor")) df[, c("x", "y")] <- convert.magic(df[, c("x", "y")], "factor")