2016-06-22 44 views
3

我的數據框包含以下內容:替代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... 

最簡單的解決方法是使用plyr的dlply功能:

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:SOLUTION:

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

也許'lapply(分割(DD $值, 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(unname(split(y $ Value,y $ Name)))'會起作用。 – Sotos

+0

@Sotos:您的第一個解決方案會返回一個錯誤:「錯誤:評估嵌套過深:無限遞歸/選項(表達式=)? 包裝過程中出現錯誤:評估嵌套過深:無限遞歸/選項(表達式=)?」。 – wsp1morlet