编辑:好的,它与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惯用解决方案。
答案 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)
感谢所有其他答案。