【发布时间】:2015-04-28 15:47:11
【问题描述】:
我有如下数据框,我需要将其重新格式化为一行,这样我就可以创建一个新数据框,该数据框是许多更简单的数据框的集合,新数据框中的一行代表所有较简单的原始数据帧之一的数据。
这是原始数据帧格式的一个简单示例:
> myDf = data.frame(Seconds=seq(0,1,.25), s1=seq(0,8,2), s2=seq(1,9,2))
>
> myDf
Seconds s1 s2
1 0.00 0 1
2 0.25 2 3
3 0.50 4 5
4 0.75 6 7
5 1.00 8 9
下面是我希望它重新格式化后的样子。每列表示rXsY,其中“rX”表示原始数据帧的行号,“sY”表示原始数据帧的“s1”或“s2”列。新数据框中省略了“秒”列,因为其信息隐含在行号中。
> myNewDf
r1s1 r1s2 r2s1 r2s2 r3s1 r3s2 r4s1 r4s2 r5s1 r5s2
1 0 1 2 3 4 5 6 7 8 9
我怀疑这真的很简单,可能涉及reshape()、melt() 和/或cast() 的某种组合,但正确的咒语让我无法理解。我可以发布我尝试过的内容,但我认为这只会分散可能是一个简单问题的注意力?如果有人希望我这样做,请在 cmets 中询问。
理想的解决方案还会以某种方式基于原始数据框的列名以编程方式生成新的列名,因为列名并不总是相同的。另外,如果不难,我能否以某种方式同时对类似数据框的列表执行相同的操作(所有相同的行数,所有相同的列名,但它们的 s1 和 s2 列中的值不同)?最终我需要一个包含来自多个更简单数据帧的数据的单个数据帧,就像这样......
> myCombinedNewDf # data combined from 4 separate original data frames
r1s1 r1s2 r2s1 r2s2 r3s1 r3s2 r4s1 r4s2 r5s1 r5s2
1 0 1 2 3 4 5 6 7 8 9
2 10 11 12 13 14 15 16 17 18 19
3 20 21 22 23 24 25 26 27 28 29
4 30 31 32 33 34 35 36 37 38 39
【问题讨论】:
-
模式是否总是
c(df[1, 2:3], df[2, 2:3], df[3, 2:3])等? -
@rawr - 我不确定你的意思;如果您在谈论 s1 & s2 列中的值,则实际数据不遵循任何模式;实际数据是来自传感器读数的“双”(浮点)值。
-
我觉得你的最后一点应该是一个单独的问题。
-
@phonetagger 我是说你似乎只是按行连接列 s1 和 s2,这不需要任何“重塑”
c(t(myDf[, 2:3])) -
@rawr 抱歉,是的,这始终是我想要的模式。但最终结果需要是一个带有命名列的数据框,适合使用 kernlab 的
ksvm进行训练/预测。