转换数据帧以使用第一列值作为列名称

时间:2017-02-15 14:44:54

标签: r dataframe melt

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

<style name="app.theme"
    parent="android:Theme.Material.Light.NoActionBar.Fullscreen">
    <item name="android:dialogTheme">@style/app.dialog</item>
    ......
</style>

<style name="app.dialog"
    parent="android:Theme.Material.Light.Dialog">
    <item name="android:colorPrimary">@color/primary</item>
    <item name="android:colorPrimaryDark">@color/primary.dark</item>
    <item name="android:colorAccent">@color/accent</item>
</style>

现在我想让 .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") 列成为我的列名,val将变为2行。

像这样:

.id

基本上.id是我的分组变量,我希望将属于1组的所有值作为一行。我期待像融化和变换一样简单。但经过多次尝试,我仍然没有成功。是否有人熟悉可以实现此目的的功能?

2 个答案:

答案 0 :(得分:2)

您可以在基座R中使用unstack执行此操作:

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

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

答案 1 :(得分: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)))