2013-04-25 56 views
2

我有一個數據幀,如下所示:串,在數據幀中的行列表對中的R

date = "2000" 
values = c("a","b","d") 
df <- data.frame(date=date,values= values) 
df 
    date values 
1 2000  a 
2 2000  b 
3 2000  d 

其實我有成千上萬值的values字段。因此,而不是打印作爲單獨的行我想打一個數據幀包含包含所有information.ie,喜歡的東西一排:

1 2000 a,b,d 

這是可能的R,像在Java map<String,arrayList(String)>

+1

請參閱'聚合'。 – A5C1D2H2I1M1N2O1R2T1 2013-04-25 09:28:16

+0

如果你告訴我們你打算對結果數據做什麼,也許會更好。 – 2013-04-25 09:30:19

+2

如果你想'values'作爲'list'然後做:'aggregate(values〜date,df,list)' – Arun 2013-04-25 09:32:30

回答

7

目前尚不清楚你想要什麼,但這裏的一些代碼aggregate,讓你開始:

> df$values <- as.character(df$values) 
> # A `list` of the values 
> (da1 <- aggregate(values ~ date, df, I, simplify=FALSE)) 
    date values 
1 2000 a, b, d 
> str(da1) 
'data.frame': 1 obs. of 2 variables: 
$ date : Factor w/ 1 level "2000": 1 
$ values:List of 1 
    ..$ 0:Class 'AsIs' chr [1:3] "a" "b" "d" 

> # All the values collapsed into one string 
> (da2 <- aggregate(values ~ date, df, paste, collapse = ", ", simplify=FALSE)) 
    date values 
1 2000 a, b, d 
> str(da2) 
'data.frame': 1 obs. of 2 variables: 
$ date : Factor w/ 1 level "2000": 1 
$ values:List of 1 
    ..$ 0: chr "a, b, d" 

我已經顯示了str,因此您可以在這裏看到兩個示例之間的區別。


如果我下面的正確理解您的評論,你可能也有興趣在此:

> date = "2000" 
> values = c("a", "b", "d") 
> (temp <- data.frame(date, values = I(list(values)))) 
    date values 
1 2000 a, b, d 
> str(temp) 
'data.frame': 1 obs. of 2 variables: 
$ date : Factor w/ 1 level "2000": 1 
$ values:List of 1 
    ..$ : chr "a" "b" "d" 
    ..- attr(*, "class")= chr "AsIs" 

換句話說,如果你想創建一個data.frame你什麼時候有一個list作爲列項必須使用I函數。

+2

+1全部歡呼聚集王! ;) – 2013-04-25 09:35:40

+0

@PaulHiemstra,我們應該重新嗎? :) – A5C1D2H2I1M1N2O1R2T1 2013-04-25 09:36:38

+1

你獨自在聚合標籤的事實是,你是唯一使用它的人;) – 2013-04-25 09:37:09

3

像這樣的東西?

df <- structure(list(date = c(2000L, 2000L, 2000L), values = structure(1:3, .Label = c("a", 
"b", "d"), class = "factor")), .Names = c("date", "values"), class = "data.frame", row.names = c(NA, 
-3L)) 

這給了你,你提出什麼作爲輸出,讓所有的信息在一個行,但所有值都在一個小區:

library(plyr) 

df2 <- ddply(df,.(date),summarize,values=as.list(paste(values,collapse=","))) 

您也可以將數據轉化爲廣泛的格式,以便每個值是一個新的變量:

library(reshape2) 

df$id <- seq_along(df) 
dfwide <- reshape(df, idvar = c("date"),timevar = "id", direction = "wide") 
+0

也許你還可以提供一個解決方案,除了將它們粘貼在一起之外,還可以提供一個'list'。我很樂意投票。 – Arun 2013-04-25 09:40:03

+0

@阿倫:我編輯它。 – JT85 2013-04-25 10:47:28

+0

這與我的意思不同,但沒關係:)(+1)。 – Arun 2013-04-25 11:31:56

2

這會給你每年值的列表:

tapply(df$values,df$date,I) 

這是你想要的嗎?

+1

'as.data.frame'似乎沒有效果。對於您的解決方案,另一種方法是分割(df $ values,df $ date)' – Arun 2013-04-25 09:38:07

+1

@Arun忽略它會產生另一個結果。也許'我'是更合適的,謝謝你的注意。 – 2013-04-25 09:41:52