将多个id.vars融合为从列表中排除的所有列

时间:2018-06-03 12:37:44

标签: r reshape2 melt

df1<-data.frame(id=c("a","b","c","d"),
                var1=c(2,4,4,5),
                var2=c(5,6,2,6),
                var3=c(5,3,2,1))

msr<-c("var1", "var2","var3")

melt(df1,
 id.vars = -c(msr), #problem here
 measure.vars = c(msr))

我有一个与此类似的数据框,除了有大量的id.vars。我想包括所有这些,最简单的方法是简单地排除用作measure.vars的列。但是,我似乎无法做到这一点。

我也尝试过:

ids<-df1[,-c(msr)] #why can't I exclude?
melt(df1,
     id.vars = c(ids), #problem here
     measure.vars = c(msr))

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

如果您知道id.vars的列列表,则无需指定reshape2::melt函数的measure.vars参数。 melt函数在这个意义上非常灵活:

  

如果id.varsblank则意味着所有non-measured个变量都会出现   用作id.vars。同样,如果提供id.vars并且   measure.varsblank,则所有non id.vars都将用作   measure.vars

因此,纠正OP使用melt所需的更改是:

library(reshape2)

msr<-c("var1", "var2","var3")

melt(df1, measure.vars = msr)  # id.vars will be all non-measured variables

#    id variable value
# 1   a     var1     2
# 2   b     var1     4
# 3   c     var1     4
# 4   d     var1     5
# 5   a     var2     5
# 6   b     var2     6
# 7   c     var2     2
# 8   d     var2     6
# 9   a     var3     5
# 10  b     var3     3
# 11  c     var3     2
# 12  d     var3     1

数据:

df1<-data.frame(id=c("a","b","c","d"),
                var1=c(2,4,4,5),
                var2=c(5,6,2,6),
                var3=c(5,3,2,1))