【问题标题】:Transforming a simple data frame [duplicate]转换一个简单的数据框[重复]
【发布时间】:2014-02-17 17:57:49
【问题描述】:

我有一个如下所示的数据框:

    ID    Club Type
1   1   arsenal 18
2   1   arsenal 31
3   1   arsenal 32
4   1   arsenal 14
5   2   chelsea 14
6   2   chelsea 31
7   2   chelsea 15
8   2   chelsea 32
9   3   fulham  27
10  3   fulham  31

我想把它变成这样的:

    ID    Club  14 15 18 27 31 32
1   1   arsenal  1  0  1  0  1  1
2   2   chelsea  1  1  0  0  1  1
3   3   fulham   0  0  0  1  1  0

所以在转换后的数据框中,如果一个类型与特定的俱乐部匹配,那么它被赋予一个 1 值,否则一个 0 值。

我的数据框比这个大很多(否则我会手动完成它们)。

有人可以给我一个关于我将如何去做的建议吗?我的问题源于以下事实:

  • 类型出现多次
  • 我不确定如何插入二进制值(我意识到我可能会做一些返回 True/False 的事情)
  • ID 元素应合并为一个元素

【问题讨论】:

  • 查看reshapereshape2 包中的castdcast 函数。我相信您可以在 R 中找到许多从“长格式”到“宽格式”的示例。
  • 我不知道其中的任何一个包——我现在来看看它们。谢谢你的建议!

标签: r dataframe reshape


【解决方案1】:
library(reshape2) 

df <- read.table("clipboard",header=T)

dcast(df, ID + Club ~ Type, length)

  ID    Club 14 15 18 27 31 32
1  1 arsenal  1  0  1  0  1  1
2  2 chelsea  1  1  0  0  1  1
3  3  fulham  0  0  0  1  1  0 

【讨论】:

    【解决方案2】:

    R 中的reshape 替代方案不是很漂亮,但您可以尝试:

    x <- data.frame(table(mydf[-1]))          # Drop "ID" when tabulating
    x$Freq <- as.numeric(as.logical(x$Freq))  # In case any are > 1
    y <- reshape(x, direction = "wide", idvar="Club", timevar="Type")
    merge(unique(mydf[1:2]), y)               # Reintroduce the ID
    #      Club ID Freq.14 Freq.15 Freq.18 Freq.27 Freq.31 Freq.32
    # 1 arsenal  1       1       0       1       0       1       1
    # 2 chelsea  2       1       1       0       0       1       1
    # 3  fulham  3       0       0       0       1       1       0
    

    【讨论】:

    • 每次我尝试在底座中使用 reshape 时,我都想把头撞到墙上。
    • @BrandonBertelsen,使用几次就不会那么糟糕了。我最不喜欢这个答案的部分是merge,因为它并不总是有效的,有时会根据输出的顺序做一些有趣的事情。
    • 我想是的。但是,如果你已经“长大”了 reshape/2,它确实会感觉有点笨拙
    猜你喜欢
    • 1970-01-01
    • 2016-05-05
    • 2019-02-12
    • 2016-02-03
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 2019-01-15
    • 2023-03-16
    相关资源
    最近更新 更多