2010-09-15 4 views
0

Как я могу получить выход как вектор в R?получить выход как вектор в R во время цикла

Например, если я хочу, чтобы иметь

for (i in 1:1000) {if i mod 123345 = 0, a = list(i)} 
a 

, но я хотел бы найти все i, которые делят равномерно на 123345 (то есть, факторы), а не только самый крупный.

+0

также, как бы я сделал то же самое в vba? – user446667

ответ

9

Там может быть более кратким способом сделать это, но я бы сделать это таким образом:

i <- 1:1000 
j <- i[12345 %% i == 0 ] 

Полученный вектор j содержит вектор значений в I, которые являются факторами 12345. В R оператор modulo - %%, и это немного сука, которую можно найти при поиске по своему усмотрению. Он похоронен в справочном документе для арифметических операторов, и вы можете найти его, выполнив поиск +, который должен быть в кавычках: ?"+", а затем вы должны немного прочитать.

Лучше добавить тег VBA, если вы хотите найти ответ VBA. Но я подозреваю, что это будет включать в себя оператор по модулю VBA;)

+0

ах, приятно - спасибо – user446667

0

Вы писали:

for (i in 1:1000) {if i mod 123345 = 0, a = list(i)} a 

код JD Лонг намного лучше, но если вы хотите эту хитрую стратегии работать попробуйте вместо:

a <- vector(mode="list"); for (i in 1:1000) {if (123345 %% i == 0){ a <-c(a,i) } } 
as.vector(unlist(a)) 
метод
2

JD Лонга действительно первое, что пришло в голову, а другой:

Filter(function(x) !(12345 %% x), 1:1000) 

I т hink это забавно, чтобы избежать необходимости в явном назначении. (Слишком плохо, чтобы каждый раз создавать новую функцию.) (В этом случае «!» Преобразует ненулевое значение в FALSE и от нуля до TRUE. «Фильтр» выбирает каждый элемент с оценкой TRUE.)

избегая также необходимость отдельного выделения и не создавая новую функцию:

which(!(12345 %% 1:1000)) 

Хронометраж:

> y <- 1:1000 
> system.time(replicate(1e5, y[12345 %% y == 0 ])) 
    user system elapsed 
    8.486 0.058 8.589 
> system.time(replicate(1e5, Filter(function(x) !(12345 %% x), y))) 

Timing stopped at: 90.691 0.798 96.118 # I got impatient and killed it 
# Even pulling the definition of the predicate outside, 
# it's still too slow for me want to wait for it to finish. 
# I'm surprised Filter is so slow. 
> system.time(replicate(1e5, which(!12345 %% y))) 
    user system elapsed 
11.618 0.095 11.792 

Так выглядит метод JD Лонга является победителем.

+0

На моей машине я получил разное время, JD-метод ~ 12.5s против вашего метода ~ 11.5s. Я использую R-2.11.1. – Marek

+0

Странный; на моем ноутбуке и R-2.11.1 JD - 12.92s, David - 5.49s, но за 1000 повторений. – mbq

+0

Если вам нужна настоящая скорость, попробуйте преобразовать все в 'integer':' system.time (replicate (1e5, y [12345L %% y == 0L])) ​​'. ('0L' означает' as.integer (0) ') – Marek

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

  • Нет связанных вопросов^_^