重塑数据框
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.frame
。 setDT()
通过引用将其转换为 data.table
。
关注these instructions即可获取。
如果您为未说明的 OS 安装 Tex 包,您可以使用 tables
和 Hmisc
包来提供更像您所要求的东西,因为表格函数是能够交付您指定的 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 代码。
我有一个这样的数据框:
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.frame
。 setDT()
通过引用将其转换为 data.table
。
关注these instructions即可获取。
如果您为未说明的 OS 安装 Tex 包,您可以使用 tables
和 Hmisc
包来提供更像您所要求的东西,因为表格函数是能够交付您指定的 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 代码。