2012-03-29 4 views
1

У меня есть следующие данные и вложенные цикл:Другой вложенный цикл в R

x <- c(12, 27, 21, 16, 12, 21, 18, 16, 20, 23, 21, 10, 15, 26, 21, 22, 22, 19, 26, 26) 
y <- c(8, 10, 7, 7, 9, 5, 7, 7, 10, 4, 10, 3, 9, 6, 4, 2, 4, 2, 3, 6) 

a <- c(20,25) 
a.sub <- c() 
df <- c() 
for(j in 1:length(a)){ 
    a.sub <- which(x >= a[j]) 
    for(i in 1:length(a.sub)){ 
     df[i] <- y[a.sub[i]]  
    } 
    print(df) 
} 

Я хотел бы цикл, чтобы вернуть значения ДФ как:

[1] 10 6 3 6 4 10 6 4 2 4 3 6 
[1] 10 6 3 6 

Как я его, однако, цикл возвращает то же значение дважды ДФ для < - 20, но не < - 25:

[1] 10 7 5 10 4 10 6 4 2 4 3 6 
[1] 10 6 3 6 4 10 6 4 2 4 3 6 
+0

'ошибка, в которой (р> = а [у]): объект«р»не found' – Chase

+2

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

+0

Спасибо, исправлена ​​ошибка выше. – srmulcahy

ответ

1
for(i in 1:length(a.sub)){ 
    df[i] <- y[a.sub[i]]  
} 

может стать

df <- y[a.sub]  

ни a.sub, ни ДФ должны быть заранее определены, то и таким образом ...

x <- c(12, 27, 21, 16, 12, 21, 18, 16, 20, 23, 21, 10, 15, 26, 21, 22, 22, 19, 26, 26) 
y <- c(8, 10, 7, 7, 9, 5, 7, 7, 10, 4, 10, 3, 9, 6, 4, 2, 4, 2, 3, 6) 

a <- c(20,25) 
for(j in 1:length(a)){ 
    a.sub <- which(x >= a[j]) 
    df <- y[a.sub]  
    print(df) 
} 

Это может быть сделано короче. df не требуется, если вы просто печатаете подмножество y в любом случае. Просто распечатайте его напрямую. И селектор настолько короток, что ни одна строка не сбивает с толку. Кроме того, зачем использовать длину строки a и index .. через напрямую. Так, это может быть ...

a <- c(20,25) 
for(ax in a){ 
    print(y[ which(x >= ax) ]) 
} 
+0

Но я не думаю, что возвращается: [1] 10 6 3 6 4 10 6 4 2 4 3 6 –

+0

Я согласен, но он упрощает его код и воспроизводит то, что на самом деле ... возможно, он может заставить его делать то, что черт возьми, он искал сейчас, что это проще. :) – John

0

Не уверен, что это упрощенная версия более сложной проблемы, но я бы, вероятно, решил это, используя некоторую прямую индексацию и функцию apply. Что-то вроде этого:

z <- cbind(x,y) 
sapply(c(20,25), function(x) z[z[, 1] >= x, 2]) 
[[1]] 
[1] 10 7 5 10 4 10 6 4 2 4 3 6 

[[2]] 
[1] 10 6 3 6 
+0

Как-то оригинальная постер хочет: 10 6 3 6 4 10 6 4 2 4 3 6 первый раз во втором цикле. –

+0

Зачем беспокоиться о cbind? Их можно рассматривать только как отдельные векторы. – John

+0

@ Джон - хорошая точка, привычка существа, я полагаю? У меня есть этот (иррациональный) страх перед тем, как объекты будут выходить из строя, если они являются полностью отдельными объектами или повреждаются какой-либо другой командой в моей рабочей области ... Я также мог бы запустить 'rm (x, y)' после создания 'z', чтобы не смутить себя тоже ... но это, вероятно, излишне и не обязательно, как вы указываете. – Chase

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