2017-04-15 10 views
1

這裏一些示例數據中:應用data.frames之間的預測()兩個名單

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)) 

我申請了支持向量機(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)) 

現在我渴望申請svm_fit_lstlst_test data.frames但R的prediction()功能給了我,當我運行下面的代碼中的錯誤:

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

錯誤UseMethod(「預測」):關於「預測」 施加到的類「列表」的對象

我只希望svm_fit_lst[1]lst_test[1]之間要施加的predict()功能沒有適用的方法,和svm_fit_lst[2]lst_test[2]

有什麼建議嗎? 感謝

+0

你實際上有'svm_fit_lst'裏面有兩個模型,它是'list',這就是你得到錯誤的原因。因此,這將工作:'{predict(svm_fit_lst [[1]],newdata = x)}' – mtoto

+0

是的,我有兩個模型在svm_fit_lst中,我希望svm_fit_lst [1]與lst_test [1]和svm_fit_lst [ 2]通過predict()函數與lst_test [2]進行比較。 – aaaaa

+1

你應該在這種情況下使用for循環。 – mtoto

回答

2

因爲你需要通過兩個列表進行迭代,考慮Map(的包裝的mapply)代替lapply

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

等價:

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

因爲我們這裏處理順序的問題,最好是寫一個for循環來完成任務:

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

好的謝謝。但循環中出現錯誤:length(svm_fit_lst)是正確的 – aaaaa

相關問題