一种优雅的方式来更改R

时间:2016-05-19 06:06:45

标签: r

我有一个data.frame,其中包含不同类型的列,例如整数,字符,数字和因子。

我需要将整数列转换为数字,以便在下一步分析中使用。

示例test.data包含4列(尽管我的实际数据集中有数千列):agegenderwork.years,和name; agework.years是整数,gender是因子,name是字符。我需要做的是将agework.years更改为数字类型。我写了一段代码来做这件事。

test.data[sapply(test.data, is.integer)] <-lapply(test.data[sapply(test.data, is.integer)], as.numeric)

虽然它有效但看起来还不够好。所以我想知道是否有更优雅的方法来实现这个功能。任何有创意的方法都将受到赞赏。

3 个答案:

答案 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"