【问题标题】:string,list pair in a row in data frame in R字符串,R中数据框中一行中的列表对
【发布时间】:2013-04-19 03:11:04
【问题描述】:

我有一个数据框如下:

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 中是否可行,类似于 java 中的map&lt;String,arrayList(String)&gt;

【问题讨论】:

  • 如果您告诉我们您打算如何处理结果数据,也许会更好。
  • 如果您想将values 用作list,请执行以下操作:aggregate(values ~ date, df, list)
  • 通过这个命令我只得到行号。日期值 1 2000 1, 2, 3 实际上我需要该行号的数据。
  • @DinoopNair,那是因为valuesfactor。只需将其更改为 characteras.character(如 Ananda 的解决方案所示)。

标签: r list map dataframe


【解决方案1】:

不清楚您想要什么,但这里有一些带有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"

我已经展示了structure,因此您可以在这里看到这两个示例之间的区别。


如果我正确理解您在下面的评论,您可能也对此感兴趣:

> 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 函数。

【讨论】:

  • @PaulHiemstra,我们应该重新标记吗? :)
  • 聚合标签中只有你一个人的事实是你是唯一使用它的人;)
  • @AnandaMahto,我认为标题和标签都需要重新设置。
  • @AnandaMahto:它很好并且工作完美。我们可以在第一次将值存储为列表吗?即,不创建df?
  • @DinoopNair,不确定我是否理解正确,但请查看我的更新。
【解决方案2】:

这样的?

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")

【讨论】:

  • 也许您还可以提供一个解决方案,除了paste 一起返回list 吗?我很乐意投票。
  • 这与我的意思不同,但没关系:) (+1)。
【解决方案3】:

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

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

这就是你想要的吗?

【讨论】:

  • as.data.frame 好像没有效果。对于您的解决方案,另一种选择是 split(df$values, df$date)
  • @Arun 省略它会产生另一个结果。不过,也许I 更合适,感谢您的关注。
猜你喜欢
  • 2016-10-22
  • 2017-07-27
  • 2023-02-23
  • 1970-01-01
  • 1970-01-01
  • 2023-01-18
  • 2012-09-22
  • 1970-01-01
  • 2018-07-10
相关资源
最近更新 更多