2017-01-06 5 views
0

編集:これは、data.all.filteredデータ型と関係があります。データ操作がうまくいかない

フィルタリングされたデータ型は、のいずれかで正常に動作するdata.all.rawから作成されます。奇妙なことは...私は2つの異なるん方法を見つけることができないということです

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 

問題がある可能性がありません一つだけ(任意の)データセットのためにそれを使用するなど、データに正常に動作します:

(上図のように)インデックスを経由してちょうど1つのデータセットへのアクセスが正常に動作していても
rpart(tp ~ ., data = data.train.filtered[[1]]) 

lapply-troughインデックスを使用すると、最初の例と同じ方法で失敗します。

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

1.実際には、おもちゃのデータを持っていると助かります。 –

+3

2. 'lapply'ではなく' purrr :: map'を試しましたか?私はそれがその目的のために正確に意味されると信じています。 RStudioのブログで「purrr」を検索すると、2つの投稿とその例が表示されます。 –

+0

省略形のないより長いバージョンの数式を試してください。 – Parfait

答えて

0

[OK]をクリックすると、最終的に回答が見つかりました。問題は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) 

おかげで、しかし:

修正が使用することでした。

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 
+0

私はそれが私のコメントで望んでいると思います。 'purrr :: map'はniiiiiceです。 –

+0

実際にはマップは「ダム」なので、数式内にドットが表示されないこともあります。 – rawr

+0

これを後で保存しますが、私が提示した方法で作業する必要がありました。 – Petrroll

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)}) 
+0

これは文字通り私が最初の例ではうまくいかないことを示したものです。または私は何かを逃していますか? – Petrroll

+0

私はこれが再現可能な例が必要な理由だと思います。 –

関連する問題