2015-05-18 2 views
0

У меня есть цикл, который выводит результат, только одно число и I (для 1:10)результата петли вставки в кадр данных

(count <- (length(which(colSums(data2[, -8])==0)))) 
print(i) 

Когда я бегом всех частей петли вручную, он печатает правильный счет (уменьшение в значении). И я мог бы вручную поместить все значения в excel в график. Тем не менее, Id, как в моем цикле для count и i, должен быть добавлен в новый кадр данных, поэтому я могу запустить это тысячу раз, чтобы получить надежный результат.

И получить dataframe так:

i count 
1 10 
2 9 
3 8 
4 6 
5 4 
6 4 
7 4 
8 3 
9 2 
10 0 

Так что мой вопрос в принципе: как извлечь «количество» и «я» и создать dataframe, чтобы соответствовать это (сделать строку для каждого I).

Наборы данных и остальная часть цикла не имеют отношения к решению, которое я думаю.

Любая помощь будет оценена, ура Jasper

РЕДАКТИРОВАТЬ

Мой текущий цикл

for(i in 1:10) { 

data2 <- data2[-sample(nrow(data2),size=1,replace=FALSE),] 
(count <- (length(which(colSums(data2[, -8])==0)))) 
print(i) 

} 
+1

'count' - это единственное число, независимо от' i' в коде, который вы написали ...? – Frank

+0

Граф - действительно одно число, не зависящее от i. > (count <- (length (which (colSums (data2 [, -8]) == 0)))) [1] 9 – Jasperovic

+0

i как время, он производит выборку по 10 раз случайным строкам и вычисляет количество столбцы с 0. Есть 10 разных образцов, поэтому он всегда мертв после 10 попыток. – Jasperovic

ответ

1

Более эффективным подходом было бы вычислить суммы столбцов первой и разности для каждого образца:

cs <- colSums(data2[,-8]) 

nsim <- 10 
res <- vector("integer",nsim) 
for (i in 1:nsim) res[i] = sum(!(cs - data2[sample(1:nrow(data2),1),-8])) 

simres <- data.frame(i=1:nsim,res=res) 

Отметьте, что length(which(x)) - то же, что и здесь sum(x); и x==0 - !x.


Комментарии. Также может быть хорошей идеей хранить ваши данные в matrix, если это все числовое число, и такие операции часто бывают.

Есть много альтернатив for петель в R. Вот пример типичный для моделирования:

res <- replicate(nsim,sum(!(cs - data2[sample(1:nrow(data2),1),-8]))) 

Если вы принимаете много образцов, вы можете также предвычисления строк слева-аута для каждой строки :

norowres <- rowSums(!(cs-data2[,-8])) # not tested 
res  <- sample(norowres,nsim,replace=TRUE) 
+0

Не подмножайте data.frame в цикле 'for'. Более эффективно заполнять вектор и помещать его в data.frame после цикла. – Roland

+0

@Roland Полезно знать; Я переключусь на это. – Frank

+1

Спасибо, simres <- data.frame (i = 1: nsim) был тем, что я искал. – Jasperovic

Смежные вопросы