重塑数据框

Reshape dataframe

我有一个这样的数据框:

col1  col2  year  mean  median
a     c     2012  14.9  14
a     c     2013  12.1  13 
r     d     2012  11.0  11
r     d     2013  13.1  15

我想将其转换为:

               2012            2013
col1  col2  mean  median    mean  median
a     c     14.9  14        12.1  13
r     d     11.0  11        13.1  15 

你可以试试reshape

reshape(df1, idvar=c('col1', 'col2'), timevar='year',  direction='wide')
#     col1 col2 mean.2012 median.2012 mean.2013 median.2013
#1    a    c      14.9          14      12.1          13
#3    r    d      11.0          11      13.1          15

数据

df1 <- structure(list(col1 = c("a", "a", "r", "r"), col2 = c("c", "c", 
"d", "d"), year = c(2012, 2013, 2012, 2013), mean = c(14.9, 12.1, 
11, 13.1), median = c(14L, 13L, 11L, 15L)), .Names = c("col1", 
"col2", "year", "mean", "median"), row.names = c(NA, -4L),
 class =   "data.frame")

Dataframes 无法容纳 2D 列 headers。看这里

https://stat.ethz.ch/R-manual/R-patched/library/base/html/colnames.html

对于数据框,rownames 的值应该是 non-duplicated 和 non-missing 名称的字符向量(这是强制执行的),对于 colnames 的字符向量 (最好)唯一的 syntactically-valid 个名字。在这两种情况下,值将被 as.character 强制转换,并且设置 colnames 会将行名称转换为字符。

注意向量在 R 中是一维的。与 R 相比,这看起来更像是数据的 Excel 表示。如果你想按年过滤,那么你可以这样做:

d[d$year == 2012,]

假设您的数据框名为 d。如果要删除年份列:

d[d$year == 2012, c(1,2,4,5)]

data.table v1.9.5+开始,dcast可以处理多个value.var列。我们可以做到:

require(data.table)
dcast(setDT(dat), col1 + col2 ~ year, value.var=c("mean", "median"))
#    col1 col2 2012_mean 2013_mean 2012_median 2013_median
# 1:    a    c      14.9      12.1          14          13
# 2:    r    d      11.0      13.1          11          15

其中 dat 是您的 data.framesetDT() 通过引用将其转换为 data.table

关注these instructions即可获取。

如果您为未说明的 OS 安装 Tex 包,您可以使用 tablesHmisc 包来提供更像您所要求的东西,因为表格函数是能够交付您指定的 two-row headers:

require(tables); require(Hmisc)
val <- tabular( (Species + 1) ~ (n=1) + Format(digits=2)*(Sepal.Length + 
                                                  Sepal.Width)*(mean + sd), data=iris )
 Hmisc::latex(val, file="tbl.tex")

当预期目录中有 pdflatex 时,"tbl.tex" 文件会传递给它,然后在我的系统上至少会以 .dvi 形式显示在名为 Skim 的 pdfviewer 中。我通过 Preview.app 将其导出为您在上面看到的 .png 文件。您可以不指定 tex 文件并将 Latex 代码打印到 R 控制台:

Hmisc::latex(val)
\begin{tabular}{lccccc}
\hline
 &  & \multicolumn{2}{c}{Sepal.Length} & \multicolumn{2}{c}{Sepal.Width} \ 
Species  & n & mean & sd & mean & \multicolumn{1}{c}{sd} \ 
\hline
setosa  & $\phantom{0}50$ & .01$ & [=11=].35$ & .43$ & [=11=].38$ \
versicolor  & $\phantom{0}50$ & .94$ & [=11=].52$ & .77$ & [=11=].31$ \
virginica  & $\phantom{0}50$ & .59$ & [=11=].64$ & .97$ & [=11=].32$ \
All  & 0$ & .84$ & [=11=].83$ & .06$ & [=11=].44$ \
\hline 
\end{tabular}
> ?latex
> val <- tabular( (Species + 1) ~ (n=1) + Format(digits=2)*
+ (Sepal.Length + Sepal.Width)*(mean + sd), data=iris )

Hmisc 中还有一个 html 函数可以生成 HTML table 代码。