繁体   English   中英

R循环和data.frame

[英]R loops and data.frame

该代码的一部分是

sse <-c()                         
k <- c()    

for (i in seq(3, 15, 1)) {                        

  y_pred <-knn(train = newdata.training, test = newdata.test,
               cl = newdata.trainLabels, k=i)

  pred_y <- as.numeric(levels(y_pred)[y_pred])            
  sse[i] <- sum((newdata.trainLabels-pred_y)^2)   

  k[i] <- i                                
}

pred_y是每个i的列。 我想创建一个包含所有13列的数据框。 可以使用for循环来完成吗? 否则如何实现? 我需要建议。

您可以使用foreach ,它具有一个附加的优点,即如果您的CPU中有多个内核,则可以并行运行。 这是非并行代码:

library("iterators")
library("foreach")
library("FNN")

data(iris3)
newdata.training <- rbind(iris3[1:25,,1], iris3[1:25,,2], iris3[1:25,,3])
newdata.test <- rbind(iris3[26:50,,1], iris3[26:50,,2], iris3[26:50,,3])
newdata.trainlabels <- factor(c(rep(1,25), rep(2,25), rep(3,25)))

k.values = seq(3, 15, 1)
start = 2  # to index sse array using k.values
sse = numeric(length = length(k.values))
results = foreach(i = iter(k.values),.combine = cbind) %do%
{
  y_pred <-knn(train = newdata.training, test = newdata.test,
               cl = newdata.trainlabels, k=i, prob = TRUE)

  pred_y <- as.numeric(levels(y_pred)[y_pred])            
  sse[i - start] <- sum((as.numeric(newdata.trainlabels)-pred_y)^2) 
  pred_y 
}

results1 = data.frame(results)
colnames(results1) = k.values

这是并行版本:

# Parallel version
library("iterators")
library("foreach")
library("parallel")
library("doParallel")
library("FNN")


data(iris3)
newdata.training <- rbind(iris3[1:25,,1], iris3[1:25,,2], iris3[1:25,,3])
newdata.test <- rbind(iris3[26:50,,1], iris3[26:50,,2], iris3[26:50,,3])
newdata.trainlabels <- factor(c(rep(1,25), rep(2,25), rep(3,25)))

num.cores = detectCores()
clusters <- makeCluster(num.cores)
registerDoParallel(clusters)
k.values = seq(3, 15, 1)
start = 2  # to index sse array using k.values
sse = numeric(length = length(k.values))
results = foreach(i = iter(k.values),.combine = cbind, .packages=c("FNN")) %dopar%
{
  y_pred <-knn(train = newdata.training, test = newdata.test,
               cl = newdata.trainlabels, k=i, prob = TRUE)

  pred_y <- as.numeric(levels(y_pred)[y_pred])            
  sse[i - start] <- sum((as.numeric(newdata.trainlabels)-pred_y)^2) 
  pred_y 
}

results1 = data.frame(results)
colnames(results1) = k.values
stopCluster(clusters)

非并行代码与并行代码之间只有几个区别。 首先,还有其他库要加载。 其次,您需要创建并注册将执行并行计算的集群(并在完成后停止集群)。 第三, foreach使用%dopar%缀运算符代替%do% 第四, foreach函数需要.packages参数将KNN传递给每个集群。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM