2015-01-08 3 views
1

Я даю первые шаги с кодированием и с R и у меня есть проблема:г кадр данных фильтра с уникальными полями

У меня есть один кадр данных с этим форматом:

Months| Person 

April Person1 

May Person2 

April Person1 

June Person 3 

May Person4 

и я хочу этот вывод:

May - Person2, Person4 

April - Person1 

June - Person3 

Я использую unique(df$months) и я получаю уникальные месяцев, но я не могу получить человек.

Я думал, сохраняю индекс каждого unique(df$months) и выбираю «человека» из этого индекса ... это для каждого unique(df$months). Но это не кажется «оптимальным» или хорошей практикой.

Кто-нибудь может мне помочь?

ответ

3

Вы можете использовать aggregate (от base R) после удаления «Дубликат» строки (unique(df)) и использовать (toString) для paste вместе уникальный «Person» сгруппированы «Месяцы». toString является оболочкой для paste(., collapse=', ')

aggregate(.~Months, unique(df), toString) 
# Months   Person 
#1 April   Person1 
#2 June   Person3 
#3 May Person2, Person4 

Или то же самое может быть сделано в data.table сначала превращением в «data.table» (setDT), удаление дубликатов и т.д. ...

library(data.table) 
unique(setDT(df))[,list(Person=toString(Person)) , Months] 
+0

благодарит это работает. .. и намного проще .... спасибо: D – RookieSun

+0

Не будет 'aggregate (Person ~ Months, df, toString)' также работать? В этом случае 'unique' выглядит как накладные расходы. Также кажется, что это задавали так много раз, и до сих пор не удается найти хороший обман. –

+0

@DavidArenburg Я пробовал это раньше, но у него будет 'April Person1, Person1' – akrun

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