将1x9数据帧重新整形为4 x 3而不进行循环

时间:2015-03-10 17:53:14

标签: r matlab dataframe

基本上,我正在为数据帧寻找R版本的MATLAB> vec2mat。我有一个1 x 9数据帧(下面是oneBYnine)我想转换成3 x 3数据帧(fourBYthree):

> oneBYnine
data
1     4
2     7
3   A.1
4     6
5     5
6     1
7   A.2
8    12
9     6
10    8
11  A.3
12   15

>fourBYthree
a b     c  d
1 4 7 A.1  6
2 5 1 A.2 12
3 6 8 A.3 15

data<-c("4","7","A.1","6", "5","1","A.2","12", "6","8","A.3", "15")
oneBYnine<-data.frame(data)

a<-c("4","5","6")
b<-c("7","1","8")
c<-c("A.1","A.2","A.3")
d<-c("6", "12", "15")

fourBYthree<-data.frame(a,b,c,d)

我是通过创建一个虚拟计数器数据帧然后循环(在尝试重塑和tidyr之后直到我的头部爆炸)来做到这一点。

Z<- as.data.frame(matrix(1:12,nrow=4,ncol=3))
Z<-as.data.frame(t(Z))

df<- as.data.frame(matrix(NA,nrow=3,ncol=4))
for(i in 1:3) 
  df[i,]<-oneBYnine$data[Z[i,1]:Z[i,4]]

df

我无法弄清楚为什么有些数据争论不起作用,而且肯定有更清洁的方法。建议?

3 个答案:

答案 0 :(得分:2)

我会通过一个矩阵:

# getting your data
oneBYnine = read.table("clipboard", stringsAsFactors = F)

mat = matrix(oneBYnine$data, ncol = 4, byrow = T)
dat = as.data.frame(mat, stringsAsFactors = F)

> dat
  V1 V2  V3 V4
1  4  7 A.1  6
2  5  1 A.2 12
3  6  8 A.3 15

stringsAsFactors = F每个列都是一个字符。您可以根据需要将它们转换为数字或因子。

答案 1 :(得分:1)

使用matrix

fourBYthree<-matrix(oneBYnine,nrow=3,ncol=4,byrow=T)

答案 2 :(得分:1)

t(matrix(data,nrow=4))

  [,1] [,2] [,3]  [,4]
[1,] "4"  "7"  "A.1" "6" 
[2,] "5"  "1"  "A.2" "12"
[3,] "6"  "8"  "A.3" "15"