2017-04-15 1 views
1

Voici quelques exemples de données:Appliquer prédire() entre data.frames dans les deux listes

df_1 = read.table(text = 'Year count var1 
         1951  12 380 
         1952  13 388 
         1953  11 400 
         1954  14 411 
         1955  14 422 
         1956  14 437 
         1957  12 451 
         1958  14 465 
         1959  13 481 
         1960  15 502 
         1961  17 522 
         1962  16 549 
         1963  14 572 
         1964  16 580', header = TRUE) 

df_2 = read.table(text = 'Year count var1 
         1951  12 380 
         1952  13 388 
         1953  11 400 
         1954  15 411 
         1955  14 422 
         1956  15 437 
         1957  11 451 
         1958  14 465 
         1959  13 481 
         1960  15 502 
         1961  20 522 
         1962  17 549 
         1963  14 572 
         1964  16 592', header = TRUE) 

lst1 = list(df_1, df_2) 


#split data.frames within lst1 and create training and testing lists 
lst_train = lapply(lst1, function(x) subset(x, Year < 1959)) 
lst_test = lapply(lst1, function(x) subset(x, Year > 1958)) 

Je demande le modèle de machine de vecteur de support (SVM):

library(e1071) 

#run SVM model for all data.frames within lst_train 
svm_fit_lst = lapply(lst_train, function(x) svm(count ~ var1, data = x)) 

Maintenant, je veux appliquer la fonction prediction() entre svm_fit_lst et lst_test data.frames mais R me donne une erreur quand je lance le code suivant:

svm_pred_lst = lapply(lst_test, function(x) {predict(svm_fit_lst, newdata = x)}) 

Erreur dans UseMethod (« prédire »): aucune méthode applicable pour « prédire » appliqué à un objet de « liste » class

Je désire que la fonction predict() à appliquer entre svm_fit_lst[1] et lst_test[1], et svm_fit_lst[2] et lst_test[2].

Une suggestion? Merci

+0

vous avez en fait deux modèles dans 'svm_fit_lst', qui est un' list' et c'est pourquoi vous obtenez l'erreur. Donc cela fonctionnera: '{predict (svm_fit_lst [[1]], newdata = x)}' – mtoto

+0

oui, j'ai deux modèles dans svm_fit_lst et je veux que svm_fit_lst [1] soit utilisé avec lst_test [1] et svm_fit_lst [ 2] avec lst_test [2] via la fonction predict(). – aaaaa

+1

vous devriez probablement utiliser une boucle for dans ce cas. – mtoto

Répondre

2

Parce que vous devez parcourir deux listes, tenez compte Map (emballage de mapply) au lieu de lapply:

svm_pred_lst = Map(function(s, l) predict(s, newdata=l), svm_fit_lst, lst_test) 

Équivalemment:

svm_pred_lst = mapply(function(s, l) predict(s, newdata=l), svm_fit_lst, lst_test, SIMPLIFY = FALSE) 
1

Parce que nous avons affaire à un problème séquentiel ici, il est préférable d'écrire une boucle pour accomplir la tâche:

result <- list() 
for (i in 1:length(svm_fit_lst)){ 
     result[[i]] <- predict(svm_fit_lst[[i]], 
           newdata = lst_test[[i]]) 
} 

#Test 
result 
#[[1]] 
#  9  10  11  12  13  14 
#13.94310 13.69655 13.55169 13.52698 13.52656 13.52656 
# 
#[[2]] 
#  9  10  11  12  13  14 
#13.84789 13.67391 13.55716 13.53580 13.53542 13.53542 
+0

ok merci. mais vous avez une erreur dans la boucle: longueur (svm_fit_lst) est la bonne – aaaaa