2016-05-11 6 views
2

Мне нужно найти наблюдение, удовлетворяющее некоторым критериям, а затем объединить эти индексы с другим набором данных. Поэтому мне не нужен индекс наблюдений, удовлетворяющих условию, но индекс, который относится ко всем наблюдениям.R получить правильный индекс, используя условие()

Например, я хочу найти max(x1) с учетом x2>20, а затем использовать этот индекс в другом наборе данных позже. Мне нужен правильный индекс, другими словами:

dat <- data.frame(name= c("A","B","C","D"), 
      x1= c(1,2,3,4), 
      x2= c(10,20,30,40)) 
dat$name[which.max(dat$x1[dat$x2>20])] 
[1] B 

Я хочу, чтобы получить

[1] D 

т.е. индекс 4, а не 2.

ответ

2

Вот один из способов, используя данные таблицы

library(data.table) 
dat <- as.data.table(dat) 
which(dat[,name]==dat[x2>20,][which.max(x1),name]) 

Can сделать что-то подобное с использованием фреймов данных, но оно будет более подробным.

which (dat$name==dat$name[which(dat$x2>20)][which.max(dat$x1[which(dat$x2>20)])]) 

Обратите внимание, что этот метод зависит от предположения, что имя содержит уникальные значения для каждой строки.

+0

Отлично, это сработало, как я надеялся. Благодарю. – 000andy8484

1

Просто используйте max вместо which.max. Однако весь фрейм данных необходимо сортировать на основе x1, так как max делает отображение 1: 1. (Спасибо @myk_raniu для уточнения)

dat <- dat[order(dat$x1),] 
dat$name[max(dat$x1[dat$x2>20])] 
#[1] D 
+1

Это работает только потому, что существует отображение 1: 1 между значениями вектора x1 и индексов. x1 = c (1,2,3,4) работает, но если вы переходите на x1 = c (1,2,4,3), он ломается и все равно дает вам D –

+0

Хорошо, я могу принять ответ, поскольку он работает в пример, который я представил. Теперь у вас есть какая-либо подсказка, почему в моем (реальном) случае он возвращает все имена, а не только те, которые соответствуют максимальному? Выбрасывая 'dat $ name', он дает одно значение, добавляя его, чтобы вернуть все имена. – 000andy8484

+0

@myk_raniu, да хорошая добыча! Благодарю. Я буду пересматривать – Sotos

1

Причины which.max не дает правильный ответ является то, что отфильтрованный список x1 короче, чем список Дат $ имени и там уже не 1: 1 Correspondance

Попробуйте вместо

dat <- data.frame(name= c("A","B","C","D"), 
        x1= c(1,2,3,4), 
        x2= c(10,20,30,40)) 

dat$name[dat$x1==max(dat$x1[dat$x2>20])] 
+0

Это будет работать нормально, тогда мне придется «присоединяться», используя имя в качестве ключа. Так как я понимаю, нет способа вернуть индекс, ссылающийся на весь набор наблюдений из условия 'which()'? Я имею в виду, что-то, что возвращает индекс '[4]', а не косвенно через имя? – 000andy8484

+0

обновлен с помощью более простого метода, который делает то, что вы ищете. вы можете использовать логическую векторную индексацию, установив TRUE значение, которое соответствует максимальному условию. –

+1

Этот метод выходит из строя, если есть повторяющиеся значения x1, и тот же самый max (x1) в подмножестве также встречается в x1 вне подмножества. Кроме того, он все равно возвращает имя, а не номер индекса, который запросил OP. – dww