What is the quickest/best way to change a large number of columns to numeric from factor?
I used the following code but it appears to have re-ordered my data.
> 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)
Ram*_*ath 71
将因子更改为数字时必须小心.下面是一行代码,可以将一组列从因子更改为数字.我在这里假设要更改为数字的列分别为1,3,4和5.你可以相应地改变它
cols = c(1, 3, 4, 5);    
df[,cols] = apply(df[,cols], 2, function(x) as.numeric(as.character(x)));
Rei*_*son 53
除了Ramnath的答案之外,您正在经历的行为是由于在R级别as.numeric(x)返回因子的内部数字表示x.如果你想保留作为因子级别的数字(而不是它们的内部表示),你需要as.character()首先根据Ramnath的例子转换为字符.
你的for循环apply和调用一样合理,并且对于代码的意图可能稍微更具可读性.只需改变这一行:
stats[,i] <- as.numeric(stats[,i])
阅读
stats[,i] <- as.numeric(as.character(stats[,i]))
这是R FAQ中的FAQ 7.10.
HTH
Jor*_*eys 34
这可以在一行中完成,不需要循环,无论是for循环还是应用.使用unlist()代替:
# testdata
Df <- data.frame(
  x = as.factor(sample(1:5,30,r=TRUE)),
  y = as.factor(sample(1:5,30,r=TRUE)),
  z = as.factor(sample(1:5,30,r=TRUE)),
  w = as.factor(sample(1:5,30,r=TRUE))
)
##
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参数.
小智 30
我知道这个问题很早就解决了,但我最近遇到了类似的问题,并且认为我已经找到了一个更优雅和功能性的解决方案,尽管它需要magrittr包.
library(magrittr)
cols = c(1, 3, 4, 5)
df[,cols] %<>% lapply(function(x) as.numeric(as.character(x)))
该%<>%运营商的管道和重新分配,这是保持数据清洗和转换简单是非常有用的.现在,通过仅指定要应用的函数,列表应用功能更容易阅读.
sbh*_*bha 13
以下是一些dplyr选项:
# by column type:
df %>% 
  mutate_if(is.factor, ~as.numeric(as.character(.)))
# by specific columns:
df %>% 
  mutate_at(vars(x, y, z), ~as.numeric(as.character(.))) 
# all columns:
df %>% 
  mutate_all(~as.numeric(as.character(.))) 
我认为ucfagls找到了为什么你的循环不起作用.
如果您仍然不想使用循环,请使用以下解决方案lapply:
factorToNumeric <- function(f) as.numeric(levels(f))[as.integer(f)] 
cols <- c(1, 3:ncol(stats))
stats[cols] <- lapply(stats[cols], factorToNumeric)
编辑.我发现更简单的解决方案.似乎as.matrix转换为角色.所以
stats[cols] <- as.numeric(as.matrix(stats[cols]))
应该做你想做的事.
lapply几乎就是为此设计的
unfactorize<-c("colA","colB")
df[,unfactorize]<-lapply(unfactorize, function(x) as.numeric(as.character(df[,x])))