我有csv文件,其内容如下
1 5
2 3
3 2
4 6
5 3
6 7
7 2
8 1
9 1
我想做的是:
1 5 4 6 7 2
2 3 5 3 8 1
3 2 6 7 9 1
,即在每第三行之后,我想并排显示不同的值列。有什么建议吗?
非常感谢
答案 0 :(得分:1)
这是使用矩阵索引执行此操作的方法。这有点奇怪,但我发现它很有趣所以我会发布它。
您需要一个索引矩阵,索引如下。这会将数据的顺序作为矩阵(列主要顺序):
1, 1
2, 1
3, 1
1, 2
2, 2
3, 2
4, 1
...
8, 2
9, 2
这给出了选择元素所需的模式。这是构建这种矩阵的一种方法。假设您的数据位于对象dat
中,即数据框或矩阵:
m <- matrix(
c(
outer(rep(1:3, 2), seq(0,nrow(dat)-1,by=3), FUN='+'),
rep(rep(1:2, each=3), nrow(dat)/3)
),
ncol=2
)
outer
表达式是所需索引矩阵的第一列,rep
表达式是第二列。现在只需使用此索引矩阵索引dat
,并构建一个包含三行的结果矩阵:
matrix(dat[m], nrow=3)
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 5 4 6 7 2
## [2,] 2 3 5 3 8 1
## [3,] 3 2 6 7 9 1
答案 1 :(得分:0)
a <- read.table(text = "1 5
2 3
3 2
4 6
5 3
6 7
7 2
8 1
9 1")
(seq_len(nrow(a))-1) %/% 3
# [1] 0 0 0 1 1 1 2 2 2
split(a, (seq_len(nrow(a))-1) %/% 3)
# $`0`
# V1 V2
# 1 1 5
# 2 2 3
# 3 3 2
# $`1`
# V1 V2
# 4 4 6
# 5 5 3
# 6 6 7
# $`2`
# V1 V2
# 7 7 2
# 8 8 1
# 9 9 1
do.call(cbind,split(a, (seq_len(nrow(a))-1) %/% 3))
# 0.V1 0.V2 1.V1 1.V2 2.V1 2.V2
# 1 1 5 4 6 7 2
# 2 2 3 5 3 8 1
# 3 3 2 6 7 9 1