一口气将数据框细分为数据框列表

时间:2019-08-24 12:24:25

标签: r

4行15列-> 12行5列。但是这不是一个简单的转变。

我尝试了t()转置函数。但这不是我所需要的。

DF1 <- as.data.frame( t( DF0))

输入:

> DF1
   V1  V2  V3  V4  V5  V6  V7  V8  V9 V10 V11 V12 V13 V14 V15
1 a01 b01 c01 d01 e01 f01 g01 h01 i01 j01 k01 l01 m01 n01 o01
2 a02 b02 c02 d02 e02 f02 g02 h02 i02 j02 k02 l02 m02 n02 o02
3 a03 b03 c03 d03 e03 f03 g03 h03 i03 j03 k03 l03 m03 n03 o03
4 a04 b04 c04 d04 e04 f04 g04 h04 i04 j04 k04 l04 m04 n04 o04

预期:

> DF1
   V1  V2  V3  V4  V5
1 a01 b01 c01 d01 e01  
2 a02 b02 c02 d02 e02  
3 a03 b03 c03 d03 e03  
4 a04 b04 c04 d04 e04  
5 f01 g01 h01 i01 j01
6 f02 g02 h02 i02 j02
7 f03 g03 h03 i03 j03
8 f04 g04 h04 i04 j04
9 k01 l01 m01 n01 o01
10 k02 l02 m02 n02 o02
11 k03 l03 m03 n03 o03
12 k04 l04 m04 n04 o04

实际:

> DF1
     V1  V2  V3  V4
V1  a01 a02 a03 a04
V2  b01 b02 b03 b04
V3  c01 c02 c03 c04
V4  d01 d02 d03 d04
V5  e01 e02 e03 e04
V6  f01 f02 f03 f04
V7  g01 g02 g03 g04
V8  h01 h02 h03 h04
V9  i01 i02 i03 i04
V10 j01 j02 j03 j04
V11 k01 k02 k03 k04
V12 l01 l02 l03 l04
V13 m01 m02 m03 m04
V14 n01 n02 n03 n04
V15 o01 o02 o03 o04

3 个答案:

答案 0 :(得分:3)

我的简单方法:

vn=c("V1","V2","V3","V4","V5")
x1=DF1[,6:10]
colnames(x1)=vn
x2=DF1[,11:15]
colnames(x2)=vn
x3=DF1[,1:5]
colnames(x3)=vn
df2=rbind(x3,x1,x2)
rownames(df2)=NULL

对不起,但我不知道如何显示自己的结果。如果有人知道,请编辑我的消息。

答案 1 :(得分:2)

1)精子DF1整形为4 x 5 x 3的阵列,交换最后两个维度,然后将其整形为12 x 5的矩阵:

NC <- 5 # number of columns desired in result. Should be a divisor of nc

nr <- nrow(DF1) # 4
nc <- ncol(DF1) # 15

matrix(aperm(array(unlist(DF1), c(nr, NC, nc/NC)), c(1, 3:2)), ncol = NC)

给出此矩阵:

      [,1]  [,2]  [,3]  [,4]  [,5] 
 [1,] "a01" "b01" "c01" "d01" "e01"
 [2,] "a02" "b02" "c02" "d02" "e02"
 [3,] "a03" "b03" "c03" "d03" "e03"
 [4,] "a04" "b04" "c04" "d04" "e04"
 [5,] "f01" "g01" "h01" "i01" "j01"
 [6,] "f02" "g02" "h02" "i02" "j02"
 [7,] "f03" "g03" "h03" "i03" "j03"
 [8,] "f04" "g04" "h04" "i04" "j04"
 [9,] "k01" "l01" "m01" "n01" "o01"
[10,] "k02" "l02" "m02" "n02" "o02"
[11,] "k03" "l03" "m03" "n03" "o03"
[12,] "k04" "l04" "m04" "n04" "o04"

2)by 也可以。用指示的向量分割t(DF1)并转置分割的每个元素,最后将它们重新绑定在一起。 ncNC来自上方

do.call("rbind", by(t(DF1),  gl(nc/NC, NC), t))

3)split.default (这种方式),我们将这种情况分为每5列,然后重塑:

sapply(split.default(DF1, 1:NC), as.matrix)

3a)还要尝试以下变体:

matrix(unlist(split.default(DF1, 1:NC)), ncol = NC)

4)排列另一种方法是注意,输出是输入的排列,当将两者作为向量剔除时,请创建该排列向量,应用该排列向量,然后将其整形为矩阵。

ap <- c(aperm(array(1:(nr*nc), c(nr, NC, nc/NC)), c(1, 3:2)))
matrix(unlist(DF1)[ap], ncol = NC)

注意

这是DF1的可复制形式:

Lines <- "   V1  V2  V3  V4  V5  V6  V7  V8  V9 V10 V11 V12 V13 V14 V15
1 a01 b01 c01 d01 e01 f01 g01 h01 i01 j01 k01 l01 m01 n01 o01
2 a02 b02 c02 d02 e02 f02 g02 h02 i02 j02 k02 l02 m02 n02 o02
3 a03 b03 c03 d03 e03 f03 g03 h03 i03 j03 k03 l03 m03 n03 o03
4 a04 b04 c04 d04 e04 f04 g04 h04 i04 j04 k04 l04 m04 n04 o04"
DF1 <- read.table(text = Lines)

答案 2 :(得分:1)

也许您可以尝试选择每第5列。使用sapply,我们可以做到

output <- as.data.frame(sapply(seq_len(ncol(df)/5), function(x) 
                        unlist(df[seq(x, ncol(df), by = 5)])))
rownames(output) <- NULL

output
#    V1  V2  V3  V4  V5
#1  a01 b01 c01 d01 e01
#2  a02 b02 c02 d02 e02
#3  a03 b03 c03 d03 e03
#4  a04 b04 c04 d04 e04
#5  f01 g01 h01 i01 j01
#6  f02 g02 h02 i02 j02
#7  f03 g03 h03 i03 j03
#8  f04 g04 h04 i04 j04
#9  k01 l01 m01 n01 o01
#10 k02 l02 m02 n02 o02
#11 k03 l03 m03 n03 o03
#12 k04 l04 m04 n04 o04

或带有split.default

的另一个选项
sapply(split.default(df, rep(1:5, ncol(df)/5)), unlist)