如何使用 reshape2 库按组转置数据框?
How to transpose a data frame by group using reshape2 library?
问题
我有 3 辆汽车(分组变量),其随时间变化的速度记录在以下数据集中。我想按组转置这个数据帧。
数据
foo <- structure(list(file.ID2 = c("Cars_03", "Cars_03", "Cars_03",
"Cars_03", "Cars_03", "Cars_03", "Cars_03", "Cars_03", "Cars_04",
"Cars_04", "Cars_04", "Cars_04", "Cars_04", "Cars_04", "Cars_04",
"Cars_04", "Cars_05", "Cars_05", "Cars_05", "Cars_05", "Cars_05",
"Cars_05", "Cars_05", "Cars_05"), speed.kph.ED = c(129.3802848,
129.4022304, 129.424176, 129.4461216, 129.4680672, 129.47904,
129.5009856, 129.5229312, 127.8770112, 127.8221472, 127.7672832,
127.7124192, 127.6575552, 127.6026912, 127.5478272, 127.4929632,
134.1095616, 134.1205344, 134.1315072, 134.1534528, 134.1644256,
134.1753984, 134.1863712, 134.197344)), row.names = c(NA, -24L
), class = c("tbl_df", "tbl", "data.frame"), .Names = c("file.ID2",
"speed.kph.ED"))
期望的输出
> foo
V2 V3 V4 V5 V6 V7 V8 V9
Cars_03 129.3803 129.4022 129.4242 129.4461 129.4681 129.4790 129.5010 129.5229
Cars_04 127.8770 127.8221 127.7673 127.7124 127.6576 127.6027 127.5478 127.4930
Cars_05 134.1096 134.1205 134.1315 134.1535 134.1644 134.1754 134.1864 134.1973
我试过的
经过大量搜索,我发现 reshape2
库很有用。我发现这个 question 似乎是相关的。因此,我尝试使用 melt()
和 dcast()
函数,如下所示:
library(reshape2)
dcast(melt(foo,id.vars = 1),
file.ID2 ~ variable, NULL)
Aggregation function missing: defaulting to length
file.ID2 speed.kph.ED
1 Cars_03 8
2 Cars_04 8
3 Cars_05 8
但这只是聚合值 (counts/sum)。请帮助我获得所需的输出。谢谢。
为了重塑数据,我喜欢使用 tidyr
库的 spread
函数。
首先,添加一个 id
列。有十亿种不同的方法可以做到这一点(我喜欢使用 dplyr
包):
library(dplyr)
foo = foo %>% group_by(file.ID2) %>% mutate(id = paste0("V",row_number()))
下面是如何使用 tidyr
库来 spread
输出数据:
library(tidyr)
answer = spread(data = foo, key = id, value = speed.kph.ED)
问题
我有 3 辆汽车(分组变量),其随时间变化的速度记录在以下数据集中。我想按组转置这个数据帧。
数据
foo <- structure(list(file.ID2 = c("Cars_03", "Cars_03", "Cars_03",
"Cars_03", "Cars_03", "Cars_03", "Cars_03", "Cars_03", "Cars_04",
"Cars_04", "Cars_04", "Cars_04", "Cars_04", "Cars_04", "Cars_04",
"Cars_04", "Cars_05", "Cars_05", "Cars_05", "Cars_05", "Cars_05",
"Cars_05", "Cars_05", "Cars_05"), speed.kph.ED = c(129.3802848,
129.4022304, 129.424176, 129.4461216, 129.4680672, 129.47904,
129.5009856, 129.5229312, 127.8770112, 127.8221472, 127.7672832,
127.7124192, 127.6575552, 127.6026912, 127.5478272, 127.4929632,
134.1095616, 134.1205344, 134.1315072, 134.1534528, 134.1644256,
134.1753984, 134.1863712, 134.197344)), row.names = c(NA, -24L
), class = c("tbl_df", "tbl", "data.frame"), .Names = c("file.ID2",
"speed.kph.ED"))
期望的输出
> foo
V2 V3 V4 V5 V6 V7 V8 V9
Cars_03 129.3803 129.4022 129.4242 129.4461 129.4681 129.4790 129.5010 129.5229
Cars_04 127.8770 127.8221 127.7673 127.7124 127.6576 127.6027 127.5478 127.4930
Cars_05 134.1096 134.1205 134.1315 134.1535 134.1644 134.1754 134.1864 134.1973
我试过的
经过大量搜索,我发现 reshape2
库很有用。我发现这个 question 似乎是相关的。因此,我尝试使用 melt()
和 dcast()
函数,如下所示:
library(reshape2)
dcast(melt(foo,id.vars = 1),
file.ID2 ~ variable, NULL)
Aggregation function missing: defaulting to length
file.ID2 speed.kph.ED
1 Cars_03 8
2 Cars_04 8
3 Cars_05 8
但这只是聚合值 (counts/sum)。请帮助我获得所需的输出。谢谢。
为了重塑数据,我喜欢使用 tidyr
库的 spread
函数。
首先,添加一个 id
列。有十亿种不同的方法可以做到这一点(我喜欢使用 dplyr
包):
library(dplyr)
foo = foo %>% group_by(file.ID2) %>% mutate(id = paste0("V",row_number()))
下面是如何使用 tidyr
库来 spread
输出数据:
library(tidyr)
answer = spread(data = foo, key = id, value = speed.kph.ED)