我的数据框有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 |
注意标题是如何更改以指示第一次观察和第二次观察。
我已经查看了有关重塑的其他答案,其他答案都没有显示如何重命名新列以包含数字。
答案 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