数据操作使得lapply不起作用

时间:2017-01-06 00:09:02

标签: r lapply rpart

编辑:好的,它与data.all.filtered数据类型有关。

过滤的数据类型是从data.all.raw创建的,适用于以下任何lapply。奇怪的是,我无法弄清楚这两者有何不同......

data.selectedFeatures <- sapply(data.train.raw, FUN = sf.getGoodFeaturesVector, treshold = 5)

data.train.filtered <- lapply(seq(1, 8), FUN = function(i) sf.filterFeatures(data.train.raw[[i]], data.selectedFeatures[[i]]))

st.testFeature <- function(featureVector, treshold) {
  if(!is.numeric(featureVector)) {return(T)}

  numberOfNonZero <- sum(featureVector > 0)
  numberOfZero <- length(featureVector) - numberOfNonZero

  return(min(numberOfNonZero, numberOfZero) >= treshold)
}

sf.getGoodFeaturesVector <- function(data, treshold) {

  selectedFeatures <- sapply(data, FUN = st.testFeature, treshold <- treshold)
  whitelistedFeatures <- names(data) %in% c("id", "tp")

  return(selectedFeatures | whitelistedFeatures)

}

sf.filterFeatures <- function(data, selectedFeatures) {
  return(data[, selectedFeatures])
}

在操纵导致后续lapply无效的数据时,有什么想法我做错了吗?

原帖:

我有一个名为data.train.filtered的数据集列表,并希望得到一个由rplot训练的模型列表(用于预测名为tp的功能)。我能想到的最简单的解决方案是使用lapply,但由于某种原因它不起作用。

lapply(data.train.filtered, function(dta) rpart(tp ~ ., data = dta))

Error in terms.formula(formula, data = data) : 
  '.' in formula and no 'data' argument 

问题可能不在数据中,因为只使用一个(任何)数据集就可以正常工作:

rpart(tp ~ ., data = data.train.filtered[[1]])

即使通过索引只访问一个数据集工作正常(如上所示)使用lapply槽索引失败的方式与第一个示例相同。

lapply(1:8, function(i) rpart(tp ~ ., data = data.train.filtered[[i]])) 

Error in terms.formula(formula, data = data) : 
  '.' in formula and no 'data' argument 

索引版本的追溯如下:

10 terms.formula(formula, data = data) 
9 terms(formula, data = data) 
8 model.frame.default(formula = tp ~ ., data = data.train.filtered[[i]], 
    na.action = function (x) 
    {
        Terms <- attr(x, "terms") ... 
7 stats::model.frame(formula = tp ~ ., data = data.train.filtered[[i]], 
    na.action = function (x) 
    {
        Terms <- attr(x, "terms") ... 
6 eval(expr, envir, enclos) 
5 eval(expr, p) 
4 eval.parent(temp) 
3 rpart(tp ~ ., data = data.train.filtered[[i]]) 
2 FUN(X[[i]], ...) 
1 lapply(1:8, function(i) rpart(tp ~ ., data = data.train.filtered[[i]])) 

我很确定我在这里遗漏了一些非常微不足道的东西,但对于R来说我是一个新手,我找不到问题。

PS:我知道我可以通过for循环遍历所有数据集,但感觉非常脏,我更喜欢R惯用解决方案。

3 个答案:

答案 0 :(得分:1)

使用data(iris)purrr::map

datas <- split(iris, rep(sample(c(1,2,3)), length.out = nrow(iris))
models <- purrr::map(datas, ~ rpart(Species ~ ., data = .x)) # a better syntax

答案 1 :(得分:1)

诀窍是在原始列表上使用lapply(),而不是在索引向量上使用# toy data: data.train.filtered <- list() # create 10 different length data frames: for(i in 1:10){ n <- rpois(1, 15) x = rnorm(n) data.train.filtered[[i]] <- data.frame(x =x, tp = 3 + 2 * x + rnorm(n) ) } library(rpart) lapply(data.train.filtered, function(dta){rpart(tp ~ ., data = dta)}) 。例如:

{
  "rules": {

    "interviews": {
      ".read": true,
        ".write": "auth != null && root.child('admins').child(auth.uid).exists()",
        "thumbnail" :{
          ".validate" : "newData.val() != 0 || (newData.val() == 0 && data.val() == 'uploading')"
        },
        "soundbyte" :{
          ".validate" : "newData.val() != 0 || (newData.val() == 0 && data.val() == 'uploading')"
        }
    },
    "token": {
      ".read": false,
      ".write": "auth != null && auth.isAdmin == true"
    },
    "admins":{
      ".read" : false,
      ".write":  "auth != null && auth.isAdmin == true" 
    }
  }
}

答案 2 :(得分:0)

好的,我终于找到了答案。问题是data.train.all实际上不是我想象的那样。我在过滤过程中遇到了一个错误(无声地,谢谢R)所有内容。

修复是使用:

data.selectedFeatures <- lapply(data.train.raw, FUN = sf.getGoodFeaturesVector, treshold = 5)

而不是

data.selectedFeatures <- sapply(data.train.raw, FUN = sf.getGoodFeaturesVector, treshold = 5)

感谢所有其他答案。