R:代码逐行工作,但未作为函数实现

时间:2015-06-28 00:47:30

标签: r subset min line-by-line

我有一个数据集(此处称为'数据'),其中包含三种重要的列:A'标签'专栏,对应一系列机构;一个小组'列出每个机构属于哪个组的列,以及一系列的“衡量标准”。列表示每个机构在不同结果/措施上的数字分数。

我的任务是编写一个功能,该功能采用用户指定的组和度量,并找到给定组中给定度量上得分最低的机构。

我写了或多或少的以下内容,虽然这有点削减,标签是通用的:

func <- function(group, measure) {
  data <- read.csv("data.csv")
  dataSubset <- data[, c(1, 2, 3, 4, 5)]
  headings <- colNames(dataSubset)

  measureInputs <- as.character(c("m1", "m2", "m3")) 
    # A vector of accepted inputs for 'measure', corresponding 
    # roughly to column names in 'dataSubset'

  nameBinding <- as.list(mapply(assign, measureInputs, headings[3:5])) 
    # Assigns each accepted input to a cognate column name in 'dataSubset'

  groupWiselist <- split(dataSubset, dataSubset$Groupcolumn) 
    # Splits 'dataSubset' by individual groups in the group column (column 2) 
    # into distinct groupwise data frames

  inputGroupdata <- groupWiselist$group 
    # Creates a single data frame, corresponding to the subset of dataSubset 
    # picked out by the user specified group

  inputMeasurecolumn <- as.vector(inputGroupdata[[nameBinding[[as.character(measure)]]]]) 
    # Creates a vector of values contained in the user specified column
    # ('measure'), within the values containing the user specified group

  labelMin <- inputGroupdata$Labelcolumn[inputMeasurecolumn == min(inputMeasurecolumn)] 
    # Finds the label within 'Labelcolumn' on the same row as the minimum 
    # value of the user specified column

  return(as.character(labelMin))
}

当我执行此功能输入我自己的值时,我会回来:

  

警告消息:在min(inputMeasurecolumn)中:min没有非缺失参数;   返回Inf

当我逐行运行代码时,不会发生此类错误。如果我在定义inputMeasurecolumn之后在return(inputMeasurecolumn)代码中包含一个额外的行,则该函数返回NULL;当我逐行运行并输入我自己的值时,inputMeasurecolumn返回一个与我期望的完全相同的合理向量,min(inputMeasurecolumn)给出了该向量的最小值。我能看到的唯一区别是,当逐行运行而不是通用的“措施”时。进入形成inputMeasurecolumn的子集的变量,我直接输入测量的名称。但是,因为在这两个实例中都存在引用列名的字符对象(感谢nameBinding),我真的无法看到它是什么。

1 个答案:

答案 0 :(得分:1)

group <- "somegroup"
groupwiseList$group

不同
groupwiseList$somegroup

您可能希望改为使用groupWiselist[,group]

我没有花时间进行全面调试,看看这是否是问题,但它确实对我不利。