我需要在我的一个任务中提供指导:在这里我需要rbind [完整行]每两列的列总数变化[任意甚至列数]取决于数据集浏览和用户上传。类似于我随文本一起上传的图像,基本上我们可以说我们正在将每两列一个堆叠在另一个上面并创建一个新的数据框,其中有两列如图所示,提前谢谢你
答案 0 :(得分:5)
我们split
数据集按列名称的字符子字符串(将gsub
中的数字删除)转换为list
,更改names
list
使用setNames
将rbind
和list
元素添加到使用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