在数据集

时间:2016-07-22 02:55:45

标签: r

我一直在尝试使用R自动化部分工作流程。我必须在我正在使用的数据集中使用转换。

我已经创建了一个使用可选参数的小函数,以便可以转换传递的数据帧的全部或部分列。

该功能现在看起来像这样:

# Function:
#   transformDivideThousand(dataframe, optional = vectorListOfVariables)
#
# Definition: This function applies a transformation, dividing variables by
# 1000. If the vector is passed it applies the transformation to all variables
# in the dataframe.
#
# Example: df <- transformDivideThousand (cases, c("label1","label2"))
#
# Source: http://stackoverflow.com/a/36912017/4417072

transformDivideThousand <- function(data_frame, listofvars){
    if (missing(listofvars)) {
        data_frame[, sapply(data_frame, is.numeric)] =
            data_frame[, sapply(data_frame, is.numeric)]/1000
    } else {
        for (i in names(data_frame)) {
            if (i %in% listofvars) {
                data_frame[,i] = data_frame[,i]/1000
            }
        }
    }
    return(data_frame)
}

好的,现在我遇到了一个问题,我必须应用一个相当复杂的转换。这次应该:

  1. 反映存储在变量中的分数(即,找到最大值并从所有其他值中减去);
  2. 得分为一分;
  3. 平方根得分;
  4. 取消分数(现在总和与第一步中减去的相同值)
  5. 所有这一切都应该保持在给定数据集的全部或部分列中运行函数的能力。

    我找到了一种创建数据框子集的方法,其中SO的值最大且函数较小:

    colMax <- function(data) sapply(data, max, na.rm = TRUE)
    

    但是我在transformDivideThousand中应用它时会遇到各种各样的问题。

    问题

    我真的在努力学习代码,到目前为止,试图对问题进行建模,我达到了以下几点:

    transformPlusOneSqrt <- function(data_frame, listofvars){
        if (missing(listofvars)) {
    
            # Find the largest value
            data_frame_max <- data_frame
            colMax <- function(data) sapply(data, max)
            data_frame_max <- colMax(data_frame_max)
    
            # Subtract the previous value
            data_frame[, sapply(data_frame, is.numeric)] =
                data_frame[, sapply(data_frame, is.numeric)] -
                data_frame_max[,sapply(data_frame_max, is.numeric)]
    
            # Plus one
            data_frame[, sapply(data_frame, is.numeric)] =
                data_frame[, sapply(data_frame, is.numeric)] + 1
    
            # Sqrt
            data_frame[, sapply(data_frame, is.numeric)] =
                sqrt(data_frame[, sapply(data_frame, is.numeric)])
    
            # Now, dereflect
            data_frame[, sapply(data_frame, is.numeric)] =
                data_frame[, sapply(data_frame, is.numeric)] +
                data_frame_max[,sapply(data_frame_max, is.numeric)]
    
        } else {  ### This part is untouched
            for (i in names(data_frame)) {
                if (i %in% listofvars) {
                    data_frame[,i] = data_frame[,i]/1000
                }
            }
        }
        return(data_frame)
    }
    

    但这不起作用,因为我得到了:

        > teste<- transformPlusOneSqrt(semDti)
     Show Traceback
    
     Rerun with Debug
     Error in Summary.factor(c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,  : 
      ‘max’ not meaningful for factors
    

    问题

    我希望能指出如何在一个函数中实现这种相当复杂的多任务转换。我不是在寻找代码,只是指针和建议。

    感谢。

1 个答案:

答案 0 :(得分:1)

问题在于max()因此colMax无法处理班级factor的数据。

您有两个选择:

  1. 测试因子类数据(if(class(data_frame[,i]) == "factor"))并在适当的地方转换为数字

  2. 使用此函数根据频率获取因子变量的max

    MaxTable <- function(InVec, mult = FALSE) {
     if (!is.factor(InVec)) InVec <- factor(InVec)
     A <- tabulate(InVec)
     if (isTRUE(mult)) {
      levels(InVec)[A == max(A)]
      }
     else levels(InVec)[which.max(A)]
    }