2013-07-30 44 views
6

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 
+1

什麼搜索詞中有你在問這裏之前試過嗎? – Roland

+0

搜索的熱門詞彙是「融化」,「投射」,「重塑」,「寬」和「長」。 –

回答

9

我使用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 
10

無需使用reshape2,您可以使用來自基地-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


標杆melt從基地reshape2stack上更大的數據:

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毫秒的保證金......

+0

@Thomas,編輯帖子中的基準測試也是很有用的(最好用更大的數據)。 – Arun

+0

@Thomas,似乎沒有這麼快...至少在這個數據大小。 – Arun

+0

如果你的意思是做「system.time」,那麼是的,這很可能是不一致的。 – Arun