假设我有一个带有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
我希望将其整理成一个整齐的形式,以便将A
,B
和C
列合并为一列,然后就可以了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)
但是我必须以一种相当不优雅的方式将行名称转换为列。我的问题是 - tidyr
或reshape
中的哪些附加功能会对此有所帮助?或者,为了在一行中实现这一结果,我对gather
的调用是否可以采用不同的方式?
答案 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