如何在单个数据帧中将数据帧拆分为大小不等的子数据帧

时间:2019-09-29 09:13:46

标签: r

我有一个excel文件,其中10000行乘以7列,并且需要根据特定的列进行拆分,并将10000 * 7拆分为n * 7个集合中的n个,并且所有集合都应位于单个数据帧中,并且集合大小不一样。并应根据特定的列名附加列名

我具有e​​xcel.xlsx格式的示例数据如下所示:

 C1.xlsx (worksheet:C_1)   
A  B  C  D  E              
1  4  6  8  C_1             
3  56 7  8  C_1             
2  4  6  1  C_1             
2  4  6  1  C_2     
2  3  6  8  C_2     
7  8  3  4  C_2     
2  3  6  8  C_2
1  4  6  8  C_2
2  3  5  6  C_2
3  4  6  7  C_2
1  9  6  1  C_2
3  4  2  7  C_3
2  1  5  1  C_3

所需的Excel工作表应如下所示

C1splitted.xlsx (worksheet: sheet 1)   
C_1.A  C_1.B  C_1.C  C_1.D  C_1.E  C_2.A  C_2.B  C_2.C  C_2.D  C_2.E  C_3.A  C_3.B  C_3.C  C_3.D   C_3.E            
1      4      6      8      C_1    2      4      6      1      C_2    3      4      2      7      C_3                
3      56     7      8      C_1    2      3      6      8      C_2    2      1      5      1      C_3             
2      4      6      1      C_1    7      8      3      4      C_2                   
                                   2      3      6      8      C_2          
                                   1      4      6      8      C_2                                  
                                   2      3      5      6      C_2                      
                                   3      4      6      7      C_2
                                   1      9      6      1      C_2

但是我如下所示使用的代码不适用于划分具有不同行数的列

wide<-cbind(C_1[C_1$E =="C_1",],C_1[C_1$E=="C_2",], C_1[C_1$E=="C_3",])

我使用的代码存在以下问题 1.我们需要在指定列中具体提及类数, 2.命名列名

我正在寻找代码以所需格式获取数据

预先感谢

2 个答案:

答案 0 :(得分:0)

简单的方法是使用split()

split(DF[, -5], DF[, 5])
$C_1
  A  B C D
1 1  4 6 8
2 3 56 7 8
3 2  4 6 1

$C_2
   A B C D
4  2 4 6 1
5  2 3 6 8
6  7 8 3 4
7  2 3 6 8
8  1 4 6 8
9  2 3 5 6
10 3 4 6 7
11 1 9 6 1

$C_3
   A B C D
12 3 4 2 7
13 2 1 5 1

如果您对格式类似的项目列表感兴趣,stack()可以协助完成该过程:

#reshape to long
stacked = data.frame(E = DF[, 5], stack(DF[, -5]))

#unite the "C_1, C_2, C3" field with the "A, B, C, ..." field
stacked$split_ind = paste0(stacked$E, '.', stacked$ind)

#split
split(stacked[, 2], stacked$split_ind)

$C_1.A
[1] 1 3 2

$C_1.B
[1]  4 56  4

$C_1.C
[1] 6 7 6

$C_1.D
[1] 8 8 1

$C_2.A
[1] 2 2 7 2 1 2 3 1

$C_2.B
[1] 4 3 8 3 4 3 4 9

$C_2.C
[1] 6 6 3 6 6 5 6 6

$C_2.D
[1] 1 8 4 8 8 6 7 1

$C_3.A
[1] 3 2

$C_3.B
[1] 4 1

$C_3.C
[1] 2 5

$C_3.D
[1] 7 1

答案 1 :(得分:0)

要获得问题中提到的所需输出,我执行了以下过程

步骤1:

使用以下命令将数据框拆分为列表

> split(DF[, -5], DF[, 5])

步骤2:

然后使用以下代码将字符串添加到列表的名称

> colnames <- c("ABC", "AA", "BB", "CC", "DD")

> for (i in seq_along(DF)){
   colnames(DF[[i]]) <- paste0(names(DF[i]), colnames) 
  }

第3步:

然后可以使用qpcR库将大小不等的列表合并到单个数据框中,如下所示:

> library(qpcR)  ## required for combining multiple dataframes from a lists

> sample2 <- do.call(qpcR:::cbind.na, DF) # combines multiple dataframes in a list by column vise irrespective of row sizes