2016-06-22 3 views
3

Мой dataframe содержит следующее:альтернатива dlply в R

data$Value data$Name 
774   Name1 
770   Name1 
778   Name1 
804   Name1 
804   Name1 
802   Name1 
804   Name1 
900   Name2 
905   Name2 
805   Name2 
900   Name2 
950   Name2 
860   Name2 
870   Name2 
etc...  etc... for 100 Names 

Таким образом, каждое имя имеет 7 значений, связанных с ним. Я хотел бы сгруппировать этот фрейм данных с помощью переменной «Имя», разделить его и вернуть 7 значений для каждого из этих имен в виде списка. Это формат моего желаемого выхода:

my_list$Name1 = 
[[1]] 
[1] 774 770 778 804 804 802 804 

my_list$Name2 = 
[[1]] 
[1] 900, 905, 805, 900, 950, 860, 870 

etc... 

Самым простым решением является использование dlply функции plyr в:

my_list <- dlply(data, "Name", function(x) list(x$Value)) 

Однако, я хотел бы избежать использования plyr. Что было бы хорошей альтернативой? Я рассмотрел разделив мои данные следующим образом:

splits <- function(x) { 
    y <- subset(data, select = c(Name, Value)) 
    splits <- split(y, y$Name) 
    return(splits) 
} 

my_list <- splits(data) 

Однако, это все еще возвращает мне список в следующем формате:

 Value Name 
     (dbl) (chr) 
1  774 Name1 
2  770 Name1 
3  778 Name1 
4  804 Name1 
5  804 Name1 
6  802 Name1 
7  804 Name1 

UPDATE: РЕШЕНИЕ:

my_list <- lapply(split(data$Value, data$Name), list) 
+1

Возможно 'lapply (сплит (дд $ Value, dd $ Name), list) ' –

ответ

4

Один из способов для этого,

y <- subset(data, select = c(Name, Value)) 
list <- split(y, y$Name) 

unlist(sapply(list, '[', 1)) 

или

unlist(unname(sapply(list, '[', 1))) 

или просто (комплименты @docendo discimus)

unlist(unname(split(y$Value, y$Name))) 

Что касается Вашего комментария, то вы можете сделать,

unname(split(y$Value, y$Name)) 
#[[1]] 
#[1] 774 770 778 804 804 802 804 

#[[2]] 
#[1] 900 905 805 900 950 860 870 
+2

Не могли бы вы просто сделать что-нибудь вроде' split (y $ Value, y $ Name) '? –

+0

Да, я думаю, 'unlist (noname (split (y $ Value, y $ Name)))' будет работать. – Sotos

+0

@Sotos: ваше первое решение возвращает мне ошибку: «Ошибка: оценка слишком сложна: бесконечная рекурсия/параметры (выражения =)? Ошибка во время обертки: оценка слишком сложна: бесконечная рекурсия/параметры (выражения =)?». – wsp1morlet

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