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
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
我使用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
無需使用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
從基地reshape2
和stack
上更大的數據:
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毫秒的保證金......
什麼搜索詞中有你在問這裏之前試過嗎? – Roland
搜索的熱門詞彙是「融化」,「投射」,「重塑」,「寬」和「長」。 –