2016-09-07 4 views
0

Есть два столбца в кадре данных, ранге, домашнем животном, в столбце рангов, самый высокий ранг - «1», второй - «2», третий один из них «10». Как я могу создать новый столбец b, чтобы выбрать самый высокий ранг в трех видах домашних животных. Например, в строке собаки я хотел бы выбрать собаку первого ряда в строке кота, я бы хотел выбрать шестой ряд кошек.выбрать лучший, второй и третий

rank<-c(1,2,7,3,10,2,10,2,1) 
pet <-c("dog","dog","dog","cat","cat","cat","bird","bird","bird") 
a <-data.frame(rank,pet) 
+1

Каков ваш ожидаемый выход? – 989

+0

Выбрать _The best one_? –

ответ

2

Используя dplyr, вы можете сделать

library(dplyr) 
a %>% group_by(pet) %>% top_n(1, -rank) 

top_n функция позволяет возвращать крайние значения для некоторого столбца. Мы группируем по pet, чтобы получить разные минуты для каждого питомца.

Или, если вы хотите новую колонку, вы могли бы сделать

a %>% group_by(pet) %>% mutate(b=rank(rank)==1) 
0
a$id <- 1:length(a$pet) 
a <- a[order(a$rank),] 
a <- a[order(a$pet),] 
b <- a[!(duplicated(a$pet)),] 

добавить столбец ID, потому что в противном случае вы не будете знать, какой питомец, в конечном итоге, то сортировать по рангу , затем сортируйте по питомец, затем удалите «дублированных» домашних животных, которые находятся ниже домашней живописи с наивысшим рейтингом.

Обратите внимание, вы сказали, что ищете столбец b в качестве вывода, но я не уверен, как это будет работать, поэтому я дал вместо этого фрейм данных. Если вы просто хотели столбца идентификаторов, вы можете использовать это, чтобы выбрать только столбец ID:

b <- a[!(duplicated(a$pet)),"id"] 
0

Используйте data.table объект для быстрого и простого манипулирования данных:

library(data.table) 
rankk<-c(1,2,7,3,10,2,10,2,1) 
pet <-c("dog","dog","dog","cat","cat","cat","bird","bird","bird") 
a <-data.table(rankk,pet) 
a[, b := min(rankk), by = pet] 

Я переопределен «rank» как «rankk», потому что rank - это имя функции в таблице данных.

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