在两个列表

时间:2017-04-15 14:46:05

标签: r list dataframe predict

这里有一些示例数据:

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

现在我希望在prediction()svm_fit_lst data.frames之间应用lst_test函数,但是当我运行以下代码时,R会给我一个错误:

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

UseMethod错误(&#34;预测&#34;):没有适用的方法来预测&#39;   应用于类&#34;列表&#34;

的对象

我只希望在predict()svm_fit_lst[1]以及lst_test[1]svm_fit_lst[2]之间应用lst_test[2]功能。

有什么建议吗? 感谢

2 个答案:

答案 0 :(得分:2)

因为您需要遍历两个列表,请考虑Mapmapply的包装)而不是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 :(得分: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