Найдите соответствующие индексы между двумя векторами в R

У меня есть матрица p-значения 10 * 10 как:

pvalue<- structure(c(NA, -0.096323162317276, 0.122216485440731, 0.096323162317276, 
0.225789770483971, 0.161574333906174, -0.0300362538546324, -0.096323162317276, 
0.161574333906174, -0.160538598895073, NA, NA, -0.127395153045654, 
-0.167788729071617, 0.253754556179047, -0.108751960098743, -0.428793430328369, 
0.167788729071617, -0.108751960098743, -0.393578499555588, NA, 
NA, NA, -0.0911444947123528, -0.214396715164185, -0.15432420372963, 
0.0248575899749994, 0.0911444947123528, -0.15432420372963, 0.151217013597488, 
NA, NA, NA, NA, 0.25789749622345, -0.15432420372963, -0.497151792049408, 
0.211289510130882, -0.15432420372963, -0.424650490283966, NA, 
NA, NA, NA, NA, -0.15432420372963, 0.0248575899749994, 0.0911444947123528, 
-0.15432420372963, 0.151217013597488, NA, NA, NA, NA, NA, NA, 
0.0300362538546324, 0.096323162317276, -0.161574333906174, 0.160538598895073, 
NA, NA, NA, NA, NA, NA, NA, 0.304505467414856, -0.262040436267853, 
-0.397721439599991, NA, NA, NA, NA, NA, NA, NA, NA, 0.349041998386383, 
0.319005727767944, NA, NA, NA, NA, NA, NA, NA, NA, NA, -0.160538598895073, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), .Dim = c(10L, 10L))

Потом я их поправил:

FDR<- p.adjust(as.numeric(pvalue), method="BH", n=45)
qplot(-log(as.numeric(pvalue), 2), FDR, ylim=c(-0.1, 0.5))

Получается следующий сюжет. Каждое значение FDR имеет соответствующее значение p. График FDR и pvalue

Вопрос в том, как я могу получить индексы x и y точки (например, обведенной точки) в обоих векторах FDR и pvalue векторов. Спасибо.


person user3789396    schedule 09.01.2015    source источник
comment
Что ж, если вы нанесете значения в виде текста, как в ответе @CMichael, а затем выполните поиск which(x==lookupvalue) ; или вы можете заказать свои данные перед построением графика и просто подсчитать! Здесь вы обвели предпоследний элемент, поэтому его x-индекс равен length(x)-2.   -  person Carl Witthoft    schedule 09.01.2015
comment
Спасибо, Карл, хорошее решение.   -  person user3789396    schedule 09.01.2015
comment
Что касается вашего комментария к моему ответу: вас действительно интересует графический рабочий процесс (вы упоминаете очень огромный набор данных) или вы просто хотите надежно определить наименьшее значение?   -  person CMichael    schedule 09.01.2015
comment
CMichael, мне нужен более надежный способ, как указано в вашем ответе. Карл добавил комментарий к вашему ответу (вверху), чтобы отсортировать созданный вами файл. Тогда используйте какой. Это не очень прямое решение, но единственное решение до сих пор.   -  person user3789396    schedule 09.01.2015


Ответы (2)


Вы можете использовать функцию locator:

После того, как вы начертите свои данные, введите:

locator(1) # to know the coordinates of only one point, locator(k) for k points

затем щелкните мышью по точке, и вы увидите координаты в консоли R.

Для вашей точки, обведенной красным кружком, это дает:

> locator(1)
$x
[1] 3.460083

$y
[1] 0.1408836

Конечно, вы можете присвоить значение переменной:

mypoint<-locator(1)

Обновление:

Чтобы получить фактические координаты, вы можете использовать функцию identify:

rk_elt<-identify(-log(as.numeric(pvalue), 2),FDR,1:length(FDR),plot=F)

Затем нажмите на точку и остановите функцию identify.

Вернувшись к консоли, вы получите x с (-log(as.numeric(pvalue), 2))[rk_elt] и y с FDR[rk_elt].

Для точки, обведенной красным кружком, это дает:

> (-log(as.numeric(pvalue), 2))[rk_elt]
[1] 3.375973
> FDR[rk_elt]
[1] 0.1398239
person Cath    schedule 09.01.2015
comment
Я бы добавил, что, поскольку locator не даст вам фактических значений x и y в наборе данных, вы, вероятно, захотите найти наиболее близкое совпадение. - person Carl Witthoft; 09.01.2015
comment
Спасибо, Кэт, очень интересно, но, как прокомментировал Карл, не фактические значения, особенно на очень загруженных графиках с очень перекрывающимися точками. - person user3789396; 09.01.2015
comment
@CarlWitthoft, ты прав. Я добавил версию с identify вместо locator, чтобы иметь настоящие координаты. Конечно, это не решает проблему перекрывающихся точек, но для решения этой проблемы лучше работать непосредственно с векторами. - person Cath; 09.01.2015

Вы имеете в виду что-то вроде этого?

dataTemp   <- data.frame(FDR)
dataTemp$x <- -log(as.numeric(pvalue), 2)

require(ggplot2)

g <- ggplot(dataTemp,aes(x=x,y=FDR))
g <- g + geom_point()
g <- g + geom_text(aes(x=x,y=FDR,label=paste(round(x,2),round(FDR,2))),size=4)
g <- g + ylim(-0.1,0.5)
g

введите здесь описание изображения

РЕДАКТИРОВАТЬ: На ваш вопрос «Мне нужен сценарий, например, чтобы найти все значения pvalue, которые соответствуют значениям min (FDR)», это очень просто:

min.FDRs <- dataTemp[dataTemp$FDR == min(dataTemp$FDR),]

Это дает отфильтрованный data.frame min.FDRs, который включает только точки, равные минимальному FDR.

person CMichael    schedule 09.01.2015
comment
Сомневаюсь - он просил индекс, а не значение. - person Carl Witthoft; 09.01.2015
comment
@CMichael, это интересный ответ, но мой реальный сюжет очень огромен, и визуально проверить соответствующие числа невозможно. Затем мне нужен скрипт, например, чтобы найти все значения p, соответствующие значениям min (FDR). Можешь помочь в этом? - person user3789396; 09.01.2015
comment
Ах проглядел указательный аспект и подумал в координатах. Вы также можете пометить их по идентификатору, а затем использовать поиск по идентификатору, но я думаю, что решение @CathG более элегантно и удобно для пользователя. - person CMichael; 09.01.2015
comment
Уважаемый CMichael, поскольку у меня NA (верхняя часть матрицы NA), то этот окончательный код возвращает NA вместо минимальных чисел. - person user3789396; 09.01.2015
comment
Хорошо, Майкл, масштабирование по x и y решило проблему перекрывающихся точек. Благодарность - person user3789396; 09.01.2015