R按行堆叠数据

时间:2016-07-08 12:42:04

标签: r stack

我正在尝试堆叠。我的数据是

set.seed(1)
x<-runif(5)
y<-runif(5)
dat<-cbind(x,y)
dat<-as.data.frame(dat)
dat
   x          y
1 0.2655087 0.89838968
2 0.3721239 0.94467527
3 0.5728534 0.66079779
4 0.9082078 0.62911404
5 0.2016819 0.06178627


stack(dat)

   values ind
1  0.26550866   x
2  0.37212390   x
3  0.57285336   x
4  0.90820779   x
5  0.20168193   x
6  0.89838968   y
7  0.94467527   y
8  0.66079779   y
9  0.62911404   y
10 0.06178627   y

然而,这是按列堆叠,即它需要y列并放置它 低于x。我想要做的是按行堆叠它:

0.2655087    x
0.89838968   y
0.3721239    x
0.94467527   y
0.5728534    x
0.66079779   y
0.9082078    x
0.62911404   y
0.2016819    x
0.06178627   y

如何使用stack完成此操作?

由于

3 个答案:

答案 0 :(得分:1)

利用矩阵的列主要存储的基本R方法。将列x和y转换为矩阵,将其转置然后展开成向量。由于我们知道结果向量的结构(排序),我们将x y名称构建为一个新变量:

data.frame(values=c(t(data.matrix(dat))), ind=I(rep(colnames(dat), nrow(dat))))

返回

       values ind
1  0.26550866   x
2  0.89838968   y
3  0.37212390   x
4  0.94467527   y
5  0.57285336   x
6  0.66079779   y
7  0.90820779   x
8  0.62911404   y
9  0.20168193   x
10 0.06178627   y

我将{y}向量包裹在I中以“隔离”它,以便它将作为data.frame函数中的字符向量而不是作为默认值的因子返回。在data.frame中使用stringsAsFactors = TRUE参数也会将x y向量作为字符类型返回。

答案 1 :(得分:0)

为什么必须使用stack()?这样就可以了:

# Creating your data frame
set.seed(1)
x<-runif(5)
y<-runif(5)
dat<-cbind(x,y)
dat<-as.data.frame(dat)
dat

# Stacking the data
dat2 <- rbind(data.frame("Value"=dat$x,"Ind"="x","Row"=seq(nrow(dat))),
      data.frame("Value"=dat$y,"Ind"="y","Row"=seq(nrow(dat))))

# Ordering the data
dat2 <- dat2[order(dat2$Row),setdiff(names(dat2),"Row")]

        Value Ind
1  0.26550866   x
6  0.89838968   y
2  0.37212390   x
7  0.94467527   y
3  0.57285336   x
8  0.66079779   y
4  0.90820779   x
9  0.62911404   y
5  0.20168193   x
10 0.06178627   y

答案 2 :(得分:0)

我们可以这样做:

data.frame(values=matrix(t(dat)), ind=colnames(dat))

       # values ind
# 1  0.26550866   x
# 2  0.89838968   y
# 3  0.37212390   x
# 4  0.94467527   y
# 5  0.57285336   x
# 6  0.66079779   y
# 7  0.90820779   x
# 8  0.62911404   y
# 9  0.20168193   x
# 10 0.06178627   y