我遇到创建和重新排列数据集的问题。这场争吵对我来说太先进了,我真的非常感谢你帮助我。如果可以用dplyr完成这样做会很棒。我在下面创建了一个我的问题的例子:我的df:
vehicle color a b c d A1 A2 A3 B1 B2 B3 C1 C2 C3 D1 D2 D3
resp
1 bike green 5 4 1 3 3 4 5 3 5 3 NaN NaN NaN NaN NaN NaN
2 walk red 5 3 3 3 4 5 3 3 5 4 NaN NaN NaN NaN NaN NaN
3 car green 4 2 3 3 4 3 5 4 5 5 NaN NaN NaN NaN NaN NaN
4 car blue 4 5 4 4 NaN NaN NaN NaN NaN NaN 5 5 5 3 3 4
5 bus black 2 4 4 3 NaN NaN NaN 2 3 3 2 2 1 NaN NaN NaN
6 car red 4 2 3 3 3 4 4 NaN NaN NaN 4 4 4 NaN NaN NaN
7 bus blue 5 5 2 3 3 3 5 4 3 2 NaN NaN NaN NaN NaN NaN
8 walk red 3 3 4 3 NaN NaN NaN 5 5 5 5 3 3 NaN NaN NaN
9 car blue 5 3 4 3 3 3 3 NaN NaN NaN 4 3 4 NaN NaN NaN
数据集包含受访者和问题的答案。我想做的是创建一个新的数据帧,其中resp作为索引,以及来自受访者回答重新排列的数据。 a,b,c,d,车辆和颜色列中的数据是为新数据框中的受访者(希望这是表达它的正确方式)堆叠的。此外,列A到C的值位于列BL_val下的新帧中。只填写大写字母(A1-D3)与小写字母(a,b,c,d)对应的数据。其余为NAN。
我想从中创建一个新的数据框,它应该如下所示:
DS:
vehicle color sl sl_val BL_val1 BL_val2 BL_val3
resp
1 bike green a 5 3 4 5
1 bike green b 4 3 5 3
1 bike green c 1 NaN NaN NaN
1 bike green d 3 NaN NaN NaN
2 walk red a 5 4 5 3
2 walk red b 3 3 5 4
2 walk red c 3 NaN NaN NaN
2 walk red d 3 NaN NaN NaN
3 car green a 4 4 3 5
3 car green b 2 4 5 5
3 car green c 3 NaN NaN NaN
3 car green d 3 NaN NaN NaN
4 car blue a 4 NaN NaN NaN
4 car blue b 5 NaN NaN NaN
4 car blue c 4 5 5 5
4 car blue d 4 3 3 4
5 bus black a 2 NaN NaN NaN
5 bus black b 4 2 3 3
5 bus black c 4 2 2 1
5 bus black d 3 NaN NaN NaN
6 car red a 4 3 4 4
6 car red b 2 NaN NaN NaN
6 car red c 3 4 4 4
6 car red d 3 NaN NaN NaN
7 bus blue a 5 3 3 5
7 bus blue b 5 4 3 2
7 bus blue c 2 NaN NaN NaN
7 bus blue d 3 NaN NaN NaN
8 walk red a 3 NaN NaN NaN
8 walk red b 3 5 5 5
8 walk red c 4 5 3 3
8 walk red d 3 NaN NaN NaN
9 car blue a 5 3 3 3
9 car blue b 3 NaN NaN NaN
9 car blue c 4 4 3 4
9 car blue d NaN NaN NaN NaN
我真的需要一些帮助,我无法弄明白!!
答案 0 :(得分:4)
使用data.table v1.9.6
:
require(data.table) # v1.9.6+
ans = melt(setDT(df), measure=patterns("^[abcd]$", "1$", "2$", "3$"),
variable.name="sl", value.name = c("sl_val", paste0("BL_val", 1:3)))
setattr(ans$sl, 'levels', letters[1:4])
setorder(ans, resp)
data.table&#39> melt
函数接受measure.vars
列表,并将每个列表组合到一个单独的列中。从那里开始,剩下的就是相应地设置级别,然后按resp
重新排序 data.table 。
有关setorder
的优势,请参阅this post。请参阅Efficient reshaping using data.tables小插图和my UseR'15 talk,详细了解如何使用data.tables进行重塑。