如何填充列表(行而不是列)以选择列数?

时间:2019-10-02 19:09:55

标签: r

设置

我有一个包含奇数个对象的列表。 为了重现性,我在下面提供了伪代码。

df <- as.list(c(1:67))

问题

1)如果长度不能被5整除,如何将该列表精简为5列?

2)如何转置数据以按行而不是按列填充。

示例

例如,我过去所做的就是(使用可被5整除的值)...

df <- as.list(c(1:65))
dim(df) <- c(length(df)/5, 5)

结果如下

      [,1] [,2] [,3] [,4] [,5]
 [1,] 1    14   27   40   53  
 [2,] 2    15   28   41   54  
 [3,] 3    16   29   42   55  
 [4,] 4    17   30   43   56  
 [5,] 5    18   31   44   57  
 [6,] 6    19   32   45   58  
 [7,] 7    20   33   46   59  
 [8,] 8    21   34   47   60  
 [9,] 9    22   35   48   61  
[10,] 10   23   36   49   62  
[11,] 11   24   37   50   63  
[12,] 12   25   38   51   64  
[13,] 13   26   39   52   65  

如果我尝试使用奇数编号列表执行此操作,则会收到此错误

Error in dim(df) <- c(length(df)/5, 5) : 
  dims [product 65] do not match the length of object [67]

如何使结果看起来像这样(即,将填充更改为逐行,最后一行保留空白)?

      [,1] [,2] [,3] [,4] [,5]
 [1,] 1    2    3    4    5  
 [2,] 6    7    8    9    10  
 [3,] 11   12   13   14   15  
 [4,] 16   17   18   19   20  
 [5,] 21   22   23   24   25  
 [6,] 26   27   28   29   30  
 [7,] 31   32   33   34   35  
 [8,] 36   37   38   39   40  
 [9,] 41   42   43   44   45  
[10,] 46   47   48   49   50  
[11,] 51   52   53   54   55  
[12,] 56   57   58   59   60  
[13,] 61   62   63   64   65  
[14,] 66   67

1 个答案:

答案 0 :(得分:0)

这是split

的一个选项
library(rowr)
lst1 <- split(unlist(df), 
       as.integer(gl(length(df), 5, length(df))))
out <- t(do.call(cbind.fill, c(lst1, fill = NA)))
row.names(out) <- NULL
out
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    1    2    3    4    5
# [2,]    6    7    8    9   10
# [3,]   11   12   13   14   15
# [4,]   16   17   18   19   20
# [5,]   21   22   23   24   25
# [6,]   26   27   28   29   30
# [7,]   31   32   33   34   35
# [8,]   36   37   38   39   40
# [9,]   41   42   43   44   45
#[10,]   46   47   48   49   50
#[11,]   51   52   53   54   55
#[12,]   56   57   58   59   60
#[13,]   61   62   63   64   65
#[14,]   66   67   NA   NA   NA

或者在split之后,根据NA元素的lengths填充list,然后rbind填充到单个{{ 1}}(matrix

base R