【发布时间】:2017-10-22 14:37:24
【问题描述】:
首先 - 我不认为这是重复的帖子。我发现了几篇关于将多列从宽格式转换为长格式的精彩帖子和网页,但它们都与我的数据不相似,因为它们处理的是同一事物的若干列(在我的示例中为 A1、A2 ,A3,A4),而且它们还没有包含长格式变量(在我的例子中是框架)。
这是我的问题:
我正在处理一个数据集,其中包含由两个不同的运动捕捉系统测量的许多变量。目前我的数据集是宽格式的,但我意识到 ggplot 在长格式下效果更好,因此我希望转换我的数据。
这是我的数据的一个非常简化的版本:
id <- (rep(1:3, each = 3))
frame <- (rep(1:3, 3))
A1 <- runif(9, min =1, max =100)
B1 <- runif(9, min =1, max =10)
C1 <- runif(9, min =-10, max =10)
A2 <- rnorm(9, mean = A1, sd=1)
B2 <- rnorm(9, mean = B1, sd=1)
C2 <- rnorm(9, mean = C1, sd=1)
df_wide <- as.data.frame.matrix(cbind(id, frame, A1, B1, C1, A2, B2, C2))
rm(id, frame, A1, A2, B1, B2, C1, C2)
df_wide$id <- as.factor(df_wide$id)
df_wide$frame <- as.factor(df_wide$frame)
head(df_wide)
id frame A1 B1 C1 A2 B2 C2
1 1 1 50.940395 4.141713 -1.294736 51.324398 4.271260 0.6174782
2 1 2 33.117691 5.044080 1.820367 32.977860 5.506677 0.8811504
3 1 3 50.000625 8.584148 -1.294245 50.603195 8.099262 0.6418580
4 2 1 61.675927 5.269216 -6.002856 61.996378 6.186417 -6.5428624
5 2 2 5.514353 6.570010 5.199728 4.798275 4.955662 5.1502535
6 2 3 51.580086 5.683788 9.831663 50.717459 5.430070 10.9601541
A1 和 A2、B1 和 B2 是系统 1 和系统 2 进行的相同类型运动(A 和 B)的度量。 如框架变量所示,每个患者都被测量了多次。
我希望我的 data.frame 看起来像这样:
id frame system A B C
1 1 1 1
2 1 1 2
3 1 2 1
4 1 2 2
5 1 3 1
6 1 3 2
我有两个问题让我无法解决这个问题:
1) 两个系统之间的测量不相邻放置。因此我不能使用这样的代码:
library(tidyr)
df_long <- gather(df_wide, System, A, A1:A2, factor_key=TRUE)
2) 我的数据集包含近 120 个变量,所以我想要一个不需要我为每个变量编写代码的解决方案。我正在考虑制作一个循环来解决这个问题,但是在这方面的任何帮助也将不胜感激。
【问题讨论】: