用户定义的函数 - 返回值的问题

时间:2018-03-20 18:18:07

标签: r function for-loop dplyr subscript

我经常遇到如何根据数据框中的某些值(例如数字,因子字符串等)从数据框列表中对数据框进行分类的问题。我在这里使用矢量的简化版本。

为这个任务写了一堆乱码的循环后,我试着写一个函数来反复解决这个问题。下面的代码返回一个下标错误(在底部给出),但我不认为这是一个下标问题,而是与我使用return相关。

除了解决这个问题之外,我非常感谢有关是否有更清洁/更好的方法来编写此功能的任何指示。

library(plyr)
library(dplyr)

#dummy data
segmentvalues <- c('1_P', '2_B', '3_R', '4_M', '5_D', '6_L')
trialvec <- vector()

for (i in 1:length(segmentvalues)){
  for (j in 1:20) {
    trialvec[i*j] <- segmentvalues[i]
  }

}

#vector categorisation
vcategorise <- function(categories, data) {
  #categorises a vector into a list of vectors
  #requires plyr and dyplyr
  assignment <- list()
  catlength <- length(categories)

  for (i in 1:length(catlength)){
    for (j in 1:length(data)) {
      if (any(contains(categories[i], ignore.case = TRUE, 
as.vector(data[j])))) {
      assignment[[i]][j] <- data[j]
    }
  }
  }
  return (assignment)
}

result <- vcategorise(categories = segmentvalues, data = trialvec)

*tmp* [[i]]:下标超出范围

时出错

1 个答案:

答案 0 :(得分:1)

你正在索引assignments - 这是好的,即使在一个没有值的索引上,只是给你NULL - 然后索引你到达那里 - - 如果获得NULL将不会工作。你会得到NULL,因为你没有将列表分配到合适的大小。

无论如何,我认为你没有必要分配一个表。您已经在测试数据生成中使用了平面索引结构,那么为什么不对assignment执行相同的操作,然后再设置其尺寸呢?

也许是这样的事情?

 vcategorise <- function(categories, data) {
     assignment <- vector("list", length = length(data) * length(categories))
     n <- length(data)
     for (i in 1:length(categories)){
         for (j in 1:length(data)) {
             assignment[(i-1)*n + j] <- 
                 if (any(contains(categories[i], 
                                  ignore.case = TRUE,
                                  as.vector(data[j])))) {
                     data[j]
                 } else {
                     NA
                 }
         }
     }

     dim(assignment) <- c(length(data), length(categories))
     assignment
 }

这不是最漂亮的代码,但如果没有完全理解你想要实现的目标,我不知道如何进一步发展。