rbind从单个数据框中每两列完成一行

时间:2016-11-22 02:14:26

标签: r

我需要在我的一个任务中提供指导:在这里我需要rbind [完整行]每两列的列总数变化[任意甚至列数]取决于数据集浏览和用户上传。类似于我随文本一起上传的图像,基本上我们可以说我们正在将每两列一个堆叠在另一个上面并创建一个新的数据框,其中有两列如图所示,提前谢谢你

converted to two column all rows are one above other

2 个答案:

答案 0 :(得分:5)

我们split数据集按列名称的字符子字符串(将gsub中的数字删除)转换为list,更改names list使用setNamesrbindlist元素添加到使用data.table的单个rbindlist,并将idcol指定为'标记'

library(data.table)
lst <- split.default(df1, gsub("\\d+", "", names(df1)))
#or use
#lst <- split.default(df1, cumsum(rep(c(TRUE, FALSE), ncol(df1)/2)))

rbindlist(setNames(lst, seq_along(lst)), idcol="Tag")

数据

set.seed(24)
df1 <- as.data.frame(matrix(rnorm(10*8), ncol=8,
    dimnames = list(NULL, paste0(rep(LETTERS[1:4], each = 2), 0:1))))

答案 1 :(得分:5)

如果您将列重命名为适当分组,则这是reshape操作:

names(df1) <- gsub("(.)(.)", "\\2.\\1", names(df1))
reshape(df1, direction="long", varying=TRUE, sep=".", timevar="Tag")

#     Tag            0           1 id
#1.A    A -0.545880758 -1.31690812  1
#2.A    A  0.536585304  0.59826911  2
#3.A    A  0.419623149 -0.76221437  3
#4.A    A -0.583627199 -1.42909030  4
#5.A    A  0.847460017  0.33224445  5
#6.A    A  0.266021979 -0.46906069  6
#7.A    A  0.444585270 -0.33498679  7
#8.A    A -0.466495124  1.53625216  8
#9.A    A -0.848370044  0.60999453  9
#10.A   A  0.002311942  0.51633570 10
#1.B    B -0.074308561 -0.03373792  1
#2.B    B -0.605156946 -0.58542756  2
# ...

使用@ akrun的df1