2

我有一个数据框如下:

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实际上我在字段中有数千个值。因此,我不想作为单独的行打印,而是让一个数据框包含一行包含所有信息。即,类似于:

1 2000    a,b,d

这在 R 中是否可能,就像map<String,arrayList(String)>在 java 中一样?

4

3 回答 3

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"

换句话说,如果您想list在创建 a 时将 a 作为列项,则data.frame必须使用该I函数。

于 2013-04-25T09:34:53.460 回答
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")
于 2013-04-25T09:34:00.350 回答
2

这将为您提供每年的值列表:

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

那是你要的吗?

于 2013-04-25T09:36:38.893 回答