ако разстоянието от една точка до други е по-малко от определено количество, как да му кажа да промени маркировката на точките?

Използвам пакета spatstat. Имам рамка от данни с координати, която съм разделил на два набора, здрави (Марк=не) и болни (Марк=да). Мога да намеря разстоянието между болната точка и всички останали точки:

>D<-crossdist(diseased,healthy)

Но сега трябва да отбележа точките си въз основа на разстоянията, на които са от болната точка, нещо като:

>i<-length(D)
>for n=1:i,
>   if D[n]<1,
>       mark(n)<-yes,
>   else,
>       mark(n)<-no,
>   end
>end

Нов съм в използването на цикли в R и никога не съм бил много добър в Matlab, все още минавам през всички помощни ръководства, но всякакви съвети как да направя това биха били много полезни.

D изглежда така:

> D
              [,1]     [,2]     [,3]     [,4]    [,5]     [,6]     [,7]     [,8]
    [1,] 0.4796548 5.906068 6.061941 5.837476 5.62358 5.196297 7.687075 1.740198
             [,9]    [,10]    [,11]    [,12]    [,13]    [,14]    [,15]    [,16]
    [1,] 2.760947 8.921383 10.64188 8.385258 6.788703 6.542282 8.631057 11.19689
            [,17]    [,18]    [,19]    [,20]    [,21]    [,22]    [,23]    [,24]
    [1,] 11.38957 11.16738 10.88189 10.48931 9.116005 7.757465 7.907191 8.453458
            [,25]   [,26]    [,27]    [,28]    [,29]    [,30]    [,31]   [,32]
    [1,] 7.072456 6.89453 8.900875 8.613843 8.569073 11.82978 11.68813 9.27332
            [,33]   [,34]    [,35]    [,36]    [,37]    [,38]    [,39]
    [1,] 9.318501 9.64491 9.264779 9.357388 9.488624 10.57165 9.173374

person user1549252    schedule 24.07.2012    source източник
comment
има много начини да се подходи към това, включително векторизирано решение, но без да видим малко от това как изглежда D (някои хора не са запознати с spatstat), е трудно да се даде точна информация. Вярвам, че функцията ifelse може да бъде полезна, ако D е вектор. Може би покажете как изглежда D с `head(D, 10) и публикувайте това.   -  person Tyler Rinker    schedule 24.07.2012
comment
D е просто матрица с 1 ред и 39 колони, по 1 за всяко от разстоянията   -  person user1549252    schedule 24.07.2012
comment
Използвайте dput(D) и поставете изхода.   -  person Ryogi    schedule 25.07.2012
comment
Изглежда, че всичките ви стойности са › 1, но векторизираната версия на вашия псевдокод ще бъде ifelse(D < 1, 'yes', 'no').   -  person Justin    schedule 25.07.2012


Отговори (1)


Два подхода за решаване на този проблем, ако наистина имате матрица (изглежда, че имате):

set.seed(10)
D <- matrix(rnorm(20) + 2, 1)

D2 <- ifelse(D > 1, "yes", "no")       #method 1
D2

D2 <- matrix(rep("no", ncol(D)), 1)    #method 2
D2[D > 1] <- "yes"
D2

Редактиране:

D2 <- ifelse(c(D) > 1, "yes", "no")       #method 1

D2 <- matrix(rep("no", ncol(D)), 1)    #method 2
D2[D > 1] <- "yes"
c(D2)
person Tyler Rinker    schedule 25.07.2012
comment
Ако това наистина е това, което OP иска да направи и D е голямо, метод 2 ще бъде по-бърз. Но моето предположение е, че mark<- е функция в spatstat. - person GSee; 25.07.2012
comment
да, мислех, че това също може да е възможност и погледнах. marks е функция, но не видях знак. Не използвам пакета и не знам. - person Tyler Rinker; 25.07.2012
comment
Така че ifelse(D ‹ 1, 'yes', 'no') свърши работа, за да ми даде матрица с да или не, ако точката е в рамките на определеното разстояние. Сега просто трябва да разбера как да променя маркировките, маркировките, означаващи дали точката е болна (да) или здрава (не), на точките в моя кадър с данни и след това да актуализирам графиката. Благодаря ти за помощта! - person user1549252; 25.07.2012
comment
Наистина, сега просто трябва да разбера как да променя матрицата, която изхвърля, така че да бъде една колона и редове за всяка точка. тогава мисля, че мога да направя нов ppp с новите маркировки (т.е. изведената матрица/таблица). Някакви идеи как да промените колоните и редовете? - person user1549252; 25.07.2012
comment
Благодаря ви, c(D2) свърши работа. Все още имам проблеми със създаването на нов ppp с marks=c(D2), но ще се върна към помощното ръководство, тъй като дори не знаех, че просто c() ще направи това, което ми трябва. Така че трябва да има просто решение за актуализиране на моя ppp. - person user1549252; 25.07.2012
comment
Накарах го да работи, като го промених на масив: D‹-crossdist(diseased,healthy) a‹-ifelse(D ‹ 1, yes, no) A‹-c(a) #changes така, че всяко число вместо това да бъде ред на колона b‹-ifelse(D‹3, 'yes', 'no') B‹-c(b) c‹-ifelse(D‹6, 'yes','no') C‹-c(c) newmarks.A‹-array(A,dim=c(length(A),1)) newmarks.B‹-array(B,dim=c(length(B),1)) newmarks.C‹-array(C ,dim=c(length(C),1)) HI17mfav attach(HI17mfav) distless1.P‹-ppp(x,y,c(-1,10),c(-1,10),marks=newmarks.A ) distless3.P‹-ppp(x,y,c(0,10),c(0,10),marks=newmarks.B) distless6.P‹-ppp(x,y,c(0,10), c(0,10),marks=newmarks.C) - person user1549252; 25.07.2012