2015-02-10 110 views
0

我有這樣的數據:data.frame列出R中

ID = c(rep("ID1",3), rep("ID2",2), "ID3", rep("ID4",2)) 
item = c("a","b","c","a","c","a","b","a") 

df = data.frame(ID,item) 

ID1 a 
ID1 b 
ID1 c 
ID2 a 
ID2 c 
ID3 a 
ID4 b 
ID4 a 

,我會需要它作爲像這樣的列表將被轉化爲「交易」:

[[1]] 
[1] "a" "b" "c" 
[[2]] 
[1] "a" "c" 
[[3]] 
[1] "a" 
[[4]] 
[1] "b" "a" 

我試着:

lapply(split(item, ID), function(x) as.list(x)) 

但項目仍然在單獨的「行」,而不是一個接一個。

關於如何完成上述格式的任何想法?

回答

2

使用unstack

df <- data.frame(ID,item) 
unstack(df, item~ID) 
# $ID1 
# [1] "a" "b" "c" 
# 
# $ID2 
# [1] "a" "c" 
# 
# $ID3 
# [1] "a" 
# 
# $ID4 
# [1] "b" "a" 
+0

真的功能很好。 – 2015-02-10 11:28:39

1

基於預期的輸出,你並不需要使用as.list

setNames(split(as.character(df1$item),df1$ID) , NULL) 
#[[1]] 
#[1] "a" "b" "c" 

#[[2]] 
#[1] "a" "c" 

#[[3]] 
#[1] "a" 

#[[4]] 
#[1] "b" "a" 
1

用你的方法,並使其工作:

> lapply(split(df, df$ID), function(u) u$item) 
#$ID1 
#[1] "a" "b" "c" 

#$ID2 
#[1] "a" "c" 

#$ID3 
#[1] "a" 

#$ID4 
#[1] "b" "a" 
+0

因爲您在分割前使用了好的技巧「as.character」,而我循環... – 2015-02-10 11:36:00

+0

因爲'df $ item'是基於OP顯示的輸入數據的'factor'。如果你使用相同的數據集,你會得到'[1] a Level:a b c'(至少這是我在'R 3.1.2'上得到的) – akrun 2015-02-10 11:38:18