【问题标题】:Matrix transformation and aggregation in RR中的矩阵变换和聚合
【发布时间】:2013-07-02 10:53:25
【问题描述】:

我开始使用 R 进行开发,但我仍然遇到该语言的“初学者问题”。我想做以下事情:

  1. 我有一个包含约 900 列的矩阵(数据框:=user),每列都是乐队的名称(Nirvana、Green Day、Daft-Punk 等)。
  2. 在每一行中,我都有一个用户和用户的音乐品味(Nirvana = 10,Green Day=5,Daft Punkt=0)
  3. 我想查询另一个数据框(:=artists - 带有艺术家的音乐标签)并用其流派标签替换乐队的名称(Nirvana --> Rock、Green Day --> Rock、Daft-Punk --> 技术)。有大约 120 个用于音乐品味的标签 (120
  4. 最后,我想“聚合”所有列的值以避免重复列。在 (3) 的示例中 - 使用聚合函数“SUM” - 该行将只有 2 个条目而不是 3 个:(Rock = 15, Techno=0)

关于如何用 R 做到这一点的任何线索?提前感谢您的帮助!

数据:

user:pastebin.com/4gVe004T

artists:pastebin.com/dm7weLMG

【问题讨论】:

  • 如果没有来自两个数据帧的实际样本数据,您将得到对此的一般反应,这将建议使用rowSums 并查看this question
  • 您能否以dput(head(artists))dput(head(user[,1:5])) 的输出形式提供此信息?
  • 你想如何按标签聚合?我的计数(来自 unique(unlist(sapply(artists[,2:6],levels))))是您有 505 个唯一标签,这意味着要添加到 user 的 505 列(每个标签一个)。并且标签不是互斥的,因此用户波段对的分数可能最终会计入多个标签变量的分数中。这就是你想要的吗?
  • +1 摇滚 > 技术。
  • @jcdmb 任何关于如何使用 R 来做到这一点的线索 通常都会转化为一些代码来说明玩具数据的示例。我假设您已经在how to make a great reproducible example 上看到了这个著名的问题

标签: r dataframe


【解决方案1】:

我有一个包含约 900 列的矩阵(数据框:=用户),每列都是乐队的名称(Nirvana、Green Day、Daft-Punk 等)。
在每一行中,我都有一个用户和用户的音乐品味(Nirvana = 10,Green Day=5,Daft Punkt=0)

这就是所谓的“宽”格式。对于大多数任务来说,最好将其重塑为窄格式,即具有两列的单个 data.frame,一列标识用户,另一列标识波段。有几个工具可以做到这一点,这里有几个关于 SO 的问题。尤其要查找 标签。

还有一个名为reshape 的包可以在这里提供帮助。我所说的过程称为“融化”数据。

我想查询另一个数据框(:=artists - 带有艺术家的音乐标签)并用乐队的流派标签替换乐队的名称(Nirvana --> Rock, Green Day --> Rock, Daft-Punk --> 技术)。有大约 120 个用于音乐品味的标签 (120

您可以使用merge 组合多个数据框,使用波段名称作为合并键。这就是为什么您希望波段名称是值而不是列名的原因。

最后,我想“聚合”所有列的值以避免重复列。在 (3) 的示例中 - 使用聚合函数“SUM” - 该行将只有 2 个条目而不是 3 个:(Rock = 15, Techno=0)

当您使用reshape 将数据“转换”回宽格式时,您可以提供一个聚合函数,用于组合值。你可以使用sum

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多