【问题标题】:categoricalToNumeric function in R with indefinite quantity of variables (Variadic function)R中的categoricalToNumeric函数,变量数量不定(变量函数)
【发布时间】:2021-12-07 19:11:46
【问题描述】:

我想用一个函数做以下事情:

categoricalToNumeric <- function(data,...) {
    for(i in list(...)) {
      data$i <- as.numeric(as.factor(data$i))
    }
  summary(data)
}

然后调用,

categoricalToNumeric(data, 'school', 'sex', 'address', 'famsize', 'Pstatus', 'Mjob', 'Fjob', 'reason', 'nursery', 'internet', 'guardian.x', 'schoolsup.x', 'famsup.x', 'paid.x', 'activities.x', 'higher.x', 'romantic.x', 'guardian.y', 'schoolsup.y', 'famsup.y', 'paid.y', 'activities.y', 'higher.y', 'romantic.y')

目前没有错误,但数据变量不会在categoricalToNumeric 调用时发生变异。

数据:https://archive.ics.uci.edu/ml/machine-learning-databases/00320/student.zip

设置:

data_mat=read.table("./data/csv/student-mat.csv",sep=";",header=TRUE)
data_por=read.table("./data/csv/student-por.csv",sep=";",header=TRUE)


data=merge(data_mat,data_por,by=c("school","sex","age","address","famsize","Pstatus","Medu","Fedu","Mjob","Fjob","reason","nursery","internet"))
print(nrow(data)) # 382 data

head(data,5)

【问题讨论】:

    标签: r function variadic-functions


    【解决方案1】:

    data$i 不是在循环中提取列的有效方法。您可以将[[ 用于单列或[ 用于多列。 for 循环的替代方法是使用 lapply

    categoricalToNumeric <- function(data,...) {
      cols <- c(...)
      data[cols] <- lapply(data[cols], function(x) as.numeric(as.factor(x)))
      summary(data)
    }
    
    categoricalToNumeric(data, 'school', 'sex', ...rest of the columns)
    

    【讨论】:

    • 我喜欢函数风格!谢谢。
    【解决方案2】:

    这很奇怪,但这很有效。而且为了方便,我把...改成colnames

    categoricalToNumeric2 <- function(data,...) {
      for(i in colnames(data)) {
        data[i] <- as.numeric(as.factor(data$i))
      }
      summary(data)
    }
    categoricalToNumeric2(data)
    
        school           sex             age           address         famsize         Pstatus           Medu            Fedu      
     Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
     1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000  
     Median :2.000   Median :2.000   Median :2.000   Median :2.000   Median :2.000   Median :2.000   Median :2.000   Median :2.000  
     Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848  
     3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000  
     Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000  
          Mjob            Fjob           reason         nursery         internet       guardian.x     traveltime.x    studytime.x   
     Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
     1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000  
     Median :2.000   Median :2.000   Median :2.000   Median :2.000   Median :2.000   Median :2.000   Median :2.000   Median :2.000  
     Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848  
     3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000  
     Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000  
       failures.x     schoolsup.x       famsup.x         paid.x       activities.x      higher.x       romantic.x       famrel.x    
     Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
     1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000  
     Median :2.000   Median :2.000   Median :2.000   Median :2.000   Median :2.000   Median :2.000   Median :2.000   Median :2.000  
     Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848  
     3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000  
     Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000  
       freetime.x       goout.x          Dalc.x          Walc.x         health.x       absences.x         G1.x            G2.x      
     Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
     1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000  
     Median :2.000   Median :2.000   Median :2.000   Median :2.000   Median :2.000   Median :2.000   Median :2.000   Median :2.000  
     Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848  
     3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000  
     Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000  
          G3.x         guardian.y     traveltime.y    studytime.y      failures.y     schoolsup.y       famsup.y         paid.y     
     Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
     1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000  
     Median :2.000   Median :2.000   Median :2.000   Median :2.000   Median :2.000   Median :2.000   Median :2.000   Median :2.000  
     Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848  
     3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000  
     Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000  
      activities.y      higher.y       romantic.y       famrel.y       freetime.y       goout.y          Dalc.y          Walc.y     
     Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
     1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000  
     Median :2.000   Median :2.000   Median :2.000   Median :2.000   Median :2.000   Median :2.000   Median :2.000   Median :2.000  
     Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848  
     3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000  
     Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000  
        health.y       absences.y         G1.y            G2.y            G3.y      
     Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
     1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000  
     Median :2.000   Median :2.000   Median :2.000   Median :2.000   Median :2.000  
     Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848   Mean   :1.848  
     3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:2.000  
     Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000   Max.   :2.000  
    

    【讨论】:

      猜你喜欢
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 2011-04-08
      • 2012-01-15
      • 2020-06-07
      相关资源
      最近更新 更多