【问题标题】:Transform a dataframe to use first column values as column names转换数据框以使用第一列值作为列名
【发布时间】:2017-07-04 07:09:59
【问题描述】:

我有一个包含 2 列的数据框:

  .id vals
1   A   10
2   B   20
3   C   30
4   A  100
5   B  200
6   C  300

dput(tst_df)
structure(list(.id = structure(c(1L, 2L, 3L, 1L, 2L, 3L), .Label = c("A", 
"B", "C"), class = "factor"), vals = c(10, 20, 30, 100, 200, 
300)), .Names = c(".id", "vals"), row.names = c(NA, -6L), class = "data.frame")

现在我想让.id 列成为我的列名,并且 vals 将变成 2 行。

像这样:

A    B    C
10   20   30
100  200  300

基本上 .id 是我的分组变量,我希望将属于 1 个组的所有值作为一行。我期待一些简单的东西,比如融化和变形。但经过多次尝试,我仍然没有成功。有没有人熟悉可以完成此任务的功能?

【问题讨论】:

  • 尝试使用tidyr。这些函数称为spreadgather。未来,pivot_longerpivot_wider 将得到支持,功能更强大。

标签: r dataframe melt


【解决方案1】:

您可以在 base R 中使用unstack

unstack(df, form=vals~.id)
    A   B   C
1  10  20  30
2 100 200 300

第一个参数是 data.frame 的名称,第二个参数是确定未堆叠结构的公式。

【讨论】:

  • @Imo 对于这个例子,它确实有效,如果我在我的大 df 上这样做,它会创建一个列表。知道这是怎么发生的吗?
  • 这意味着每个级别 (.id) 的观察次数不同。如果 data.frame 结构很重要,您可以在实现 unstack 之前检测、创建和 rbind 缺失的行。
  • @Imo 感谢您的提示!在我删除缺失的观察结果后,它似乎起作用了
【解决方案2】:

你也可以使用tapply

do.call(cbind, tapply(df$vals, df$.id, I))
#       A   B   C
#[1,]  10  20  30
#[2,] 100 200 300

或将其包装在数据框中,即

as.data.frame(do.call(cbind, tapply(df$vals, df$.id, I)))

【讨论】:

    猜你喜欢
    • 2014-08-18
    • 2021-05-19
    • 2021-08-24
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2016-05-03
    • 1970-01-01
    相关资源
    最近更新 更多