data.frame
是以行 - 记录形式呈现的向量列表。但是,在某些情况下,以列为记录的形式显示数据对屏幕更友好。例如,
> data.frame(date=c("2014-10-01", "2014-10-02", "2014-10-03"), x = c(1,2,3), y = c(2,3,4), stringsAsFactors = TRUE)
date x y
1 2014-10-01 1 2
2 2014-10-02 2 3
3 2014-10-03 3 4
此表示对于具有许多记录的长数据是友好的。如果想要将这些数据放入表格中,例如knitr::kable()
,并将降价文档编织为html文档,那么该表对于观看者来说太宽了。呈现此数据框架的视觉上更好的方法是将其转置为
date 2014-10-01 2014-10-02 2014-10-03
x 1 2 3
y 2 3 4
这可以通过t()
部分实现,但数据框将被强制转换为字符矩阵,在这种情况下这是不希望的。
是否有现成的实现方法可以轻松地以列为记录的形式呈现数据框而无需将其转换为矩阵?
答案 0 :(得分:1)
有几种工具可以帮助“重塑”您的数据,这将是您应该使用其中一种数据的示例。例如,使用“reshape2”,您可以执行以下操作:
library(reshape2)
dcast(melt(dat, measure.vars = c("x", "y")),
variable ~ date, value.var = "value")
# variable 2014-10-01 2014-10-02 2014-10-03
# 1 x 1 2 3
# 2 y 2 3 4
同样,对于“dplyr”和“tidyr”,您可以执行以下操作:
library(dplyr)
library(tidyr)
dat %>%
gather(Date, value, x, y) %>%
spread(date, value)
# Date 2014-10-01 2014-10-02 2014-10-03
# 1 x 1 2 3
# 2 y 2 3 4
答案 1 :(得分:0)
尝试:
> ddf = data.frame(date=c("2014-10-01", "2014-10-02", "2014-10-03"), x = c(1,2,3), y = c(2,3,4), stringsAsFactors = TRUE)
>
> data.frame(t(ddf))
X1 X2 X3
date 2014-10-01 2014-10-02 2014-10-03
x 1 2 3
y 2 3 4
>
为了更好地维护结构:
tddf = data.frame(t(ddf))
names(tddf) = unlist(tddf[1,])
tddf = tddf [-1,]
tddf = data.frame(sapply(tddf, as.numeric))
rownames(tddf) = c('x','y')
tddf
X2014.10.01 X2014.10.02 X2014.10.03
x 1 1 2
y 2 3 3
str(tddf)
'data.frame': 2 obs. of 3 variables:
$ X2014.10.01: num 1 2
$ X2014.10.02: num 1 3
$ X2014.10.03: num 2 3
答案 2 :(得分:0)
试试这个:
#input data
df <- data.frame(date=c("2014-10-01", "2014-10-02", "2014-10-03"),
x = c(1,2,3),
y = c(2,3,4))
#transform
df1 <- data.frame(t(df[,c(2,3)]))
colnames(df1) <- df$date
#output
df1
# 2014-10-01 2014-10-02 2014-10-03
# x 1 2 3
# y 2 3 4