在列名 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个,那就不值得了。
我使用 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个,那就不值得了。