这里有一些示例数据:
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]
功能。
有什么建议吗? 感谢
答案 0 :(得分: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 :(得分: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