R 将列转换为保留列名称的行

R 将列转换为保留列名称的行,r,dataframe,R,Dataframe,在R中有没有办法将列转换为保留列名称的行 输入示例: A B 1 1 2 3 3 4 44 5 输出 Group Number A 1 A 2 A 3 A 44 B 1 B 3 B 4 B 5 我使用重塑2 > x <- data.frame(A = 1:5, B = 55:51) > library(reshape2) &g

在R中有没有办法将列转换为保留列名称的行

输入示例:

A   B
1   1
2   3
3   4
44  5
输出

 Group Number
  A       1
  A       2
  A       3
  A       44 
  B       1
  B       3
  B       4
  B       5

我使用
重塑2

> x <- data.frame(A = 1:5, B = 55:51)
> library(reshape2)
> melt(x)
Using  as id variables
   variable value
1         A     1
2         A     2
3         A     3
4         A     4
5         A     5
6         B    55
7         B    54
8         B    53
9         B    52
10        B    51
我发现差别很小,当关闭
melt
的打印时,差别会变小。看起来我在模拟中关闭冗余模式的直觉可能有所帮助

> microbenchmark(stack(DF), melt(DF, measure.vars = names(DF)[grepl("X", names(DF))]), times=100)
Unit: milliseconds
                                                      expr      min       lq   median       uq      max neval
                                                 stack(DF) 94.33681 124.9958 132.1747 144.7323 287.7438   100
 melt(DF, measure.vars = names(DF)[grepl("X", names(DF))]) 99.44282 141.0594 150.2625 178.8081 249.0888   100

无需使用
重塑2
,您可以使用base-R中的
堆栈
功能:

您的.data
为例:

res <- stack(your.data)
colnames(res) = c("Number", "Group")
另见


基于更大数据的
重塑2
堆栈
基准测试
melt

require(reshape2)
set.seed(45)
DF <- data.frame(matrix(sample(20, 1e6, TRUE), ncol=100))

require(microbenchmark)
microbenchmark(stack(DF), melt(DF), times=100)

Unit: milliseconds
      expr      min       lq   median       uq      max neval
 stack(DF) 157.7084 187.1993 241.8206 251.7132 334.5488   100
  melt(DF) 174.6079 253.1088 261.6234 273.3971 443.9953   100
require(重塑2)
种子(45)

DF在这里询问之前,您尝试过哪些搜索词?搜索的热门词是“熔化”、“铸造”、“重塑”、“宽”和“长”。@Thomas,在帖子中编辑基准测试也很有用(最好是使用更大的数据)。@Thomas,似乎没有两倍快。。。至少在这样的数据量下。如果你说的是“系统时间”,那么是的,它很可能是不一致的。我只是在新会话上运行了5次。。。中值时间不同,但两者之间的差异在20到40毫秒之间。@Arun感谢添加基准测试,我看到大约50毫秒的差异。
> res
  Number Group
1      1     A
2      2     A
3      3     A
4     44     A
5      1     B
6      3     B
7      4     B
8      5     B
require(reshape2)
set.seed(45)
DF <- data.frame(matrix(sample(20, 1e6, TRUE), ncol=100))

require(microbenchmark)
microbenchmark(stack(DF), melt(DF), times=100)

Unit: milliseconds
      expr      min       lq   median       uq      max neval
 stack(DF) 157.7084 187.1993 241.8206 251.7132 334.5488   100
  melt(DF) 174.6079 253.1088 261.6234 273.3971 443.9953   100