если расстояние от одной точки до других меньше определенной величины, как мне сказать изменить отметку точек?

Я использую пакет 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
              [,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, 'да', 'нет') сработало, чтобы дать мне матрицу да или нет, если точка находилась в пределах указанного расстояния. Теперь мне просто нужно выяснить, как изменить метки, метки, означающие, является ли точка больной (да) или здоровой (нет) точек в моем фрейме данных, а затем обновить график. Спасибо за помощь! - person user1549252; 25.07.2012
comment
Действительно, теперь мне просто нужно выяснить, как изменить матрицу, которую он выдает, чтобы она состояла из одного столбца и строк для каждой точки. тогда я думаю, что могу сделать новый ppp с новыми метками (т.е. выведенной матрицей/таблицей). Любые идеи о том, как изменить столбцы и строки? - person user1549252; 25.07.2012
comment
Спасибо, c(D2) сработал. У меня все еще есть проблемы с созданием нового ppp с отметками = c(D2), но я вернусь к справочному руководству, поскольку я даже не знал, что просто c() сделает то, что мне нужно. Поэтому должно быть простое решение для обновления моего файла ppp. - person user1549252; 25.07.2012
comment
Я заставил его работать, изменив его на массив: D‹-crossdist(больной,здоровый) a‹-ifelse(D‹ 1, да, нет) A‹-c(a) # вместо этого каждое число становится строкой столбца b‹-ifelse(D‹3, 'да', 'нет') B‹-c(b) c‹-ifelse(D‹6, 'да', 'нет') C‹-c(c) newmarks.A‹-массив(A,dim=c(длина(A),1)) newmarks.B‹-массив(B,dim=c(длина(B),1)) newmarks.C‹-массив(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