2017-02-15 21 views
1

我有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列,成为我的列名,丘壑将成为2行。

像这样:

A B C 
10 20 30 
100 200 300 

基本上.ID是我的分组变量,我想将所有的值属于1组作为行。我期望一些简单的东西如融化和变换。但经过多次尝试,我仍然没有成功。有没有人熟悉将实现这一目标的功能?

回答

2

可以在基R 2与unstack做到这一点:

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

第一个参数是所述data.frame的名称和所述第二是决定取消堆栈结构的公式。

+0

@Imo在这个例子中它的工作原理的确,如果我做我的大DF它创建一个列表。任何想法如何发生? –

+0

这意味着您没有相同数量的每个级别的观察值(.id)。如果data.frame结构很重要,那么在执行'unstack'之前,您可以检测,创建和“绑定”缺失的行。 – lmo

+1

@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))) 
相关问题