我的数据框有productID,Seller1Name,Seller1Price,Seller2Name,Seller2Price,如下所示。 表(DF)由productID唯一:
ProductID Seller1Name Seller1Price Seller2Name Seller2Price
1 A $1 X $3
2 B $3 Y $6
3 C $2 Z $1
所需的输出应为DF:
ProductID Seller Price
1 A $1
1 X $3
2 B $3
2 Y $6
3 C $2
3 Z $1
我尝试使用reshape包但结果很时髦:
Output <-melt(DF, Id = c("ProductID"))
有更好的方法吗?
答案 0 :(得分:3)
在data.table v1.9.5
中,当前的devel版本,melt
for data.tables已经获得了一项新功能 - 能够融合到多个列上。
require(data.table) ## v1.9.5+
ans = melt(setDT(DF), measure=patterns("Name$", "Price$"),
value.name=c("seller", "price"))
我们只提供要组合在一起的列,同时在measure.vars
参数中作为列表进行融合。
现在,您可以删除variable
列并重新排序,如下所示:
setorder(ans[, variable := NULL], ProductID)[]
# ProductID seller price
# 1: 1 A $1
# 2: 1 X $3
# 3: 2 B $3
# 4: 2 Y $6
# 5: 3 C $2
# 6: 3 Z $1
HTH
答案 1 :(得分:1)
另一个选项是来自merged.stack
splitstackshape
library(splitstackshape)
res <- merged.stack(DF, var.stubs=c('Name', 'Price'), sep='var.stubs',
atStart=FALSE)[,2:= NULL][]
setnames(res, 2, 'Seller')
res
# ProductID Seller Price
#1: 1 A $1
#2: 1 X $3
#3: 2 B $3
#4: 2 Y $6
#5: 3 C $2
#6: 3 Z $1