【问题标题】:Convert columns to rows keeping the name of the column将列转换为保留列名的行
【发布时间】:2013-07-30 13:20:30
【问题描述】:

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

【问题讨论】:

  • 在这里提问之前您尝试过哪些搜索词?
  • 搜索热词有“melt”、“cast”、“reshape”、“wide”和“long”。

标签: r dataframe


【解决方案1】:

不需要使用reshape2,你可以使用base-R中的stack函数:

your.data 为例:

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

给你

> 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

另见here


基于更大的数据对 meltreshape2stack 进行基准测试:

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

似乎stack 更快,但相差 20 毫秒...

【讨论】:

  • @Thomas,在帖子中编辑基准测试也很有用(最好使用更大的数据)。
  • @Thomas,似乎没有两倍快......至少在这个数据大小的情况下。
  • 如果你的意思是做“system.time”,那么是的,很可能不一致。
  • 我只跑了 5 次,每次都在新的会话中...中位时间不同,但两者之间的差异在 20 到 40 毫秒之间。
  • @Arun 感谢您添加基准测试,我看到大约有 50 毫秒的差异。
【解决方案2】:

我使用reshape2

> 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), times=100)
    Unit: milliseconds
          expr      min       lq   median       uq      max neval
     stack(DF) 122.3086 133.8435 139.6990 180.5338 250.9316   100
      melt(DF) 140.0183 198.2025 227.8125 245.3444 367.1552   100

我发现差异很小,当关闭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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多