1

假设我有这个带有行名的凌乱数据框

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

我想把它整理成整齐的形式,使列A、、BC折叠成一列,并且还有一列用于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是否可以通过不同的方式来实现这一结果?

4

1 回答 1

4

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

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

Or, you can use the matrix method for melt from "reshape2":

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

In base R, you can use stack and just recycle the 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

Or, with some slight trickery, making use of the data.frame method for tables, you can do:

data.frame(as.table(as.matrix(df)))
#     Var1 Var2        Freq
# 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
于 2014-11-05T18:43:37.690 回答