在列名 R 中使用 id 变量重塑

Reshape with id-variable in column names R

我使用 R 已经有一段时间了,但很少使用 reshape 或 reshape2 包。我目前正在尝试将数据集从宽格式重塑为长格式,其中指示变量是变量名称的一部分。这是我的数据框的当前结构:

mydf <- data.frame(district = c(1:2),
v.mandate = c(1, 3),
s.mandate = c(2, 4),
v.perc = c(.4, .3),
s.perc = c(.5, .6))

> mydf
  district v.mandate s.mandate v.perc s.perc
1        1         1         2    0.4    0.5
2        2         3         4    0.3    0.6

我想将其重塑为长格式并将 "v." 和 "s." 提取为 id 变量(在实际数据集中,列表更长)。请参阅下面的示例。

mydf2 <- data.frame(district = c(1, 1, 2, 2),
party = c("v", "s", "v", "s"),
mandate = c(1, 2, 3, 4),
perc = c(.4, .5, .3, .6))

> mydf2
  district party mandate perc
1        1     v       1  0.4
2        1     s       2  0.5
3        2     v       3  0.3
4        2     s       4  0.6

我试过同时使用 reshape 和 melt 函数,但我似乎无法从变量名中提取指示变量。相反,数据集被重塑为长格式,但将完整的变量名称作为 id 变量。请参阅下面的示例。

> melt(mydf, id.vars=1)
  district  variable value
1        1 v.mandate   1.0
2        2 v.mandate   3.0
3        1 s.mandate   2.0
4        2 s.mandate   4.0
5        1    v.perc   0.4
6        2    v.perc   0.3
7        1    s.perc   0.5
8        2    s.perc   0.6

这可能是一个小问题,但我一直无法在线找到解决方案。

非常感谢任何帮助!

data.table v1.9.5可以直接熔化到多列。 Installation instructions.

require(data.table) # v1.9.5+
ans = melt(setDT(mydf), measure=patterns("^mandate", "^perc"), 
             value.name=c("mandate", "perc"))
#    district variable mandate perc
# 1:        1        1       1  0.4
# 2:        2        1       3  0.3
# 3:        1        2       2  0.5
# 4:        2        2       4  0.6

setattr(ans$variable, 'levels', c("v", "s"))

您可以使用 gsub() 自动提取级别。目前还没有直接的方法来提取关卡(对我来说似乎并不是在所有情况下都那么简单)。

我可能不称职,但似乎您将变量命名为与 reshape 假定的相反(例如 v.mandate 而不是 mandate.v)。我颠倒了他们的命名,并且可以让它工作:

mydf <- data.frame(district = c(1:2),
                   mandate.v = c(1, 3),
                   mandate.s = c(2, 4),
                   perc.v = c(.4, .3),
                   perc.s = c(.5, .6))

#reshape data
mydf2 = reshape(mydf,
                varying=2:5, #variables 2:5 varies
                direction = "long", #towards long
                timevar="party", #the grouping variable
                idvar="district", #identifying variable
                sep = ".") #separated by dots

这给出:

> mydf2
    district party mandate perc
1.v        1     v       1  0.4
2.v        2     v       3  0.3
1.s        1     s       2  0.5
2.s        2     s       4  0.6

您可能需要某种自动反转整个数据框中名称的方法。我在上面手动完成,因为只有 4 个变量。如果你有100个,那就不值得了。