创建评分函数并应用于R中的每一行

时间:2015-09-18 00:30:07

标签: r

我想对R中的每一行应用一个函数,该行“得分”一行x的每个值。好像我在R中使用'apply'函数来做这件事,但不知道该怎么做。我想输入一个带有整数值列的数据帧,并有一个带分数的矢量输出。我现在的代码如下:

ScoreFn <- function(x){
  score <- 0
  if(x<1) {
    score <- 0
  } else if(x==1) {
    score <- 5
  } else if(x==2) {
    score <- 10
  } else if(x==3) {
    score <- 20
  } else if(x >= 4 && x <= 10) {
    score <- 30
  } else if(x >= 11 && x <= 20) {
    score <- 40
  } else if(x >= 21) {
    score <- 50
  }

  return(score)
}

apply(df$x, 1, ScoreFn())

另外,我收到此消息。不确定执行此功能的最佳方式。

1: In if (x < 1) { :
  the condition has length > 1 and only the first element will be used
2: In if (x == 1) { :
  the condition has length > 1 and only the first element will be used
3: In if (x == 2) { :
  the condition has length > 1 and only the first element will be used
4: In if (x == 3) { :
  the condition has length > 1 and only the first element will be used

...

2 个答案:

答案 0 :(得分:4)

您可以使用剪切制作矢量化功能,因此您根本不必使用“应用”:

scorefun <- function(x){
   as.numeric(as.character(cut(x, breaks = c(0, 1, 2, 3, 4, 11, 21, Inf),
                                  labels = c(0,5,10,20,30,40, 50), right = FALSE)))
}
df <- data.frame(x = 0:10)
scorefun(df$x)
[1]  0  5 10 20 30 30 30 30 30 30 30

这也可以减少输入if / elses的重量,并且比非矢量化版本快10倍左右。

它的工作原理是将给定的向量(在这种情况下为df$x)切割为切片,由断点给出。然后,我们会使用您的分数标记它们,然后使用as.characteras.numeric再次输出数字。

答案 1 :(得分:0)

如果您的输入只是data.frame的一列,则不需要使用apply。您可以改为使用sapply

ScoreFn <- function(x){
 score <- 0
  if(x<1) {
    score <- 0
  } else if(x==1) {
    score <- 5
  } else if(x==2) {
    score <- 10
  } else if(x==3) {
    score <- 20
  } else if(x >= 4 && x <= 10) {
    score <- 30
  } else if(x >= 11 && x <= 20) {
    score <- 40
  } else if(x >= 21) {
    score <- 50
  }

  return(score)
}

# Return a list of scores
sapply(df$x, ScoreFn)