我有一个包含奇数个对象的列表。 为了重现性,我在下面提供了伪代码。
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
答案 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