使用Incremental自定义标头名称重新整理R列

时间:2016-07-01 12:18:25

标签: python r statistics

我的数据框有3列,Min,Max,Average。数据框包含7000行。

| Min | Max | Average |
| 1.2 | 1.4 | 1.3     |
| 1.0 | 2.0 | 1.5     |
| 1.2 | 1.4 | 1.6     |
| 1.0 | 7.0 | 1.9     |

我想要

| Min1 | Max1 | Average1 | Min2 | Max2 | Average2 |
| 1.2  | 1.4  | 1.3      | 1.0  | 2.0  | 1.5      |
| 1.2  | 1.4  | 1.6      | 1.0  | 7.0  | 1.9      |

注意标题是如何更改以指示第一次观察和第二次观察。

我已经查看了有关重塑的其他答案,其他答案都没有显示如何重命名新列以包含数字。

1 个答案:

答案 0 :(得分:2)

R中,我们可以使用data.table。将'data.frame'转换为'data.table'(setDT(df1)),使用'grp'创建分组变量,以便每两行都有一个唯一索引('grp'),使用dcast我们使用公式方法将'long'转换为'wide'格式。 rowid(grp)为每个grp提供一个序列。

library(data.table)
setDT(df1)[, grp := gl(.N, 2, .N)]
res <- dcast(df1, grp~rowid(grp), value.var = c("Min", "Max", "Average"), 
                            sep="")[, grp := NULL][]

如果需要,我们可以order OP的帖子中显示的列。

res[, order(as.numeric(sub("\\D+", "", names(res)))), with =FALSE]
#   Min1 Max1 Average1 Min2 Max2 Average2
#1:  1.2  1.4      1.3    1    2      1.5
#2:  1.2  1.4      1.6    1    7      1.9

我们也可以使用base R执行此操作,方法是通过创建序列向量并cbind输出

来分割数据集
do.call(cbind, split(df1,  (seq_len(nrow(df1))-1) %%2 + 1))

或者我们可以将具有逻辑索引的交替行(循环到最后一行)进行子集化,并使用data.frame来连接它们。

data.frame(df1[c(TRUE, FALSE),], df1[c(FALSE, TRUE),])
#  Min Max Average Min.1 Max.1 Average.1
#1 1.2 1.4     1.3     1     2       1.5
#3 1.2 1.4     1.6     1     7       1.9