我有一个data.frame,其中包含不同类型的列,例如整数,字符,数字和因子。
我需要将整数列转换为数字,以便在下一步分析中使用。
示例:test.data
包含4列(尽管我的实际数据集中有数千列):age
,gender
,work.years
,和name
; age
和work.years
是整数,gender
是因子,name
是字符。我需要做的是将age
和work.years
更改为数字类型。我写了一段代码来做这件事。
test.data[sapply(test.data, is.integer)] <-lapply(test.data[sapply(test.data, is.integer)], as.numeric)
虽然它有效但看起来还不够好。所以我想知道是否有更优雅的方法来实现这个功能。任何有创意的方法都将受到赞赏。
答案 0 :(得分:20)
我认为优雅的代码有时是主观的。对我来说,这是优雅的,但与OP的代码相比可能效率较低。但是,由于问题是关于优雅的代码,可以使用它。
test.data[] <- lapply(test.data, function(x) if(is.integer(x)) as.numeric(x) else x)
另外,另一个优雅的选项是dplyr
library(dplyr)
library(magrittr)
test.data %<>%
mutate_each(funs(if(is.integer(.)) as.numeric(.) else .))
答案 1 :(得分:7)
现在dplyr
非常优雅(magrittr
%<>%
运营商)
test.data %<>% mutate_if(is.integer,as.numeric)
答案 2 :(得分:1)
我认为这样的任务最好用显式循环完成。你不要在这里买任何东西,用一个像lapply()
这样的函数的隐藏循环替换一个简单的for循环。例如:
## generate data
set.seed(1L);
N <- 3L; test.data <- data.frame(age=sample(20:90,N,T),gender=factor(sample(c('M','F'),N,T)),work.years=sample(1:5,N,T),name=sample(letters,N,T),stringsAsFactors=F);
test.data;
## age gender work.years name
## 1 38 F 5 b
## 2 46 M 4 f
## 3 60 F 4 e
str(test.data);
## 'data.frame': 3 obs. of 4 variables:
## $ age : int 38 46 60
## $ gender : Factor w/ 2 levels "F","M": 1 2 1
## $ work.years: int 5 4 4
## $ name : chr "b" "f" "e"
## solution
for (cn in names(test.data)[sapply(test.data,is.integer)])
test.data[[cn]] <- as.double(test.data[[cn]]);
## result
test.data;
## age gender work.years name
## 1 38 F 5 b
## 2 46 M 4 f
## 3 60 F 4 e
str(test.data);
## 'data.frame': 3 obs. of 4 variables:
## $ age : num 38 46 60
## $ gender : Factor w/ 2 levels "F","M": 1 2 1
## $ work.years: num 5 4 4
## $ name : chr "b" "f" "e"