我正在尝试堆叠。我的数据是
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
完成此操作?
由于
答案 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