重塑数据框架

时间:2014-11-05 18:39:11

标签: r reshape tidyr

假设我有一个带有rownames的不整洁的数据框

df<-data.frame(A=rnorm(2),B=rnorm(2),C=rnorm(2))
rownames(df)<-c('male','female')
> df                
            A         B          C
male   0.10138957  1.036535  2.0708251
female 0.08524181 -1.140275 -0.3800585

我希望将其整理成一个整齐的形式,以便将ABC列合并为一列,然后就可以了Gender的附加列。它可能看起来像这样

> desired_df
   where    value   Gender
1    A  0.10138957   male
2    A  0.08524181 female
3    B  1.03653464   male
4    B -1.14027549 female
5    C  2.07082513   male
6    C -0.38005851 female

以下是使用tidyr实现此目标的一种方法。

desired_df<-gather(df,where,value)
desired_df['Gender']<-rep(c('male','female'),nrow(df)/2)

但是我必须以一种相当不优雅的方式将行名称转换为列。我的问题是 - tidyrreshape中的哪些附加功能会对此有所帮助?或者,为了在一行中实现这一结果,我对gather的调用是否可以采用不同的方式?

1 个答案:

答案 0 :(得分:4)

您可以通过多种方式访问​​“desired_df”。这里有一个“dplyr”和“tidyr”,我们将这些步骤更方便地组合在一起:

library(tidyr)
library(dplyr)
df %>% cbind(rn = rownames(df)) %>% gather(where, value, A:C)

或者,您可以使用来自“reshape2”matrix的{​​{1}}方法:

melt

在基数R中,您可以使用library(reshape2) melt(as.matrix(df)) # Var1 Var2 value # 1 male A -1.58936590 # 2 female A -2.11861101 # 3 male B -0.04883463 # 4 female B 1.77685001 # 5 male C 0.22472189 # 6 female C 1.35717680 并仅回收stack

rownames

或者,通过一些轻微的诡计,对cbind(rn = rownames(df), stack(df)) # rn values ind # 1 male -1.58936590 A # 2 female -2.11861101 A # 3 male -0.04883463 B # 4 female 1.77685001 B # 5 male 0.22472189 C # 6 female 1.35717680 C s使用data.frame方法,您可以这样做:

table
相关问题