【发布时间】:2017-11-21 22:15:37
【问题描述】:
我正在处理 3D 运动捕捉数据。这意味着我有 3 列 (X,Y,Z) 的关节坐标用于身体中的几个关节(例如,描述左膝关节中心位置的三列是:LKX、LKY、LKZ)。
我的最终目标是绘制至少 9 个联合中心,我相信实现这一目标的唯一方法是将我的宽格式数据帧转换为长数据帧。
如您所知,我正在尝试转换多组以 X、Y 或 Z 结尾的关节中心。因此,我尝试在 tidyr:extract 中使用正则表达式,但我无法正确编写代码.
df_wide <- data.frame(
ID = rep(1:2, each=10),
JN = rep(1:2, each=5),
Frame = rep(1:5, 4),
System = rep(1:2, 10),
RKX = rep(1:10+rnorm(10,mean=1,sd=0.5),2),
RKY = rep(1:10+rnorm(10,mean=1,sd=0.5),2),
RKZ = rep(1:10+rnorm(10,mean=1,sd=0.5), 2),
LHeX = rep(1:10-rnorm(10,mean=1,sd=0.5),2),
LHeY = rep(1:10-rnorm(10,mean=1,sd=0.5),2),
LHeZ = rep(1:10-rnorm(10,mean=1,sd=0.5),2))
head(df_wide, 2)
ID JN Frame System RKX RKY RKZ LHeX LHeY LHeZ
1 1 1 1 1 1.332827 2.068720 2.295742 -0.02336031 -0.3011227 -1.212326
2 1 1 2 2 3.570076 3.306799 3.136177 2.08828231 1.9226740 2.106496
我希望得到这个结果:
ID JN Frame System joint X Y Z
1 1 1 1 1 RK 1.440103 2.221676 1.621871
2 1 1 1 1 LHe 3.537940 3.060948 2.856955
这是我最近的(许多)尝试。它有两个问题; 1)提取只产生NA; 2) spread 返回“错误:行的重复标识符”我怀疑这与提取的问题有关。
df_3D <- df_wide %>%
gather(keys, values, -ID, -JN, -Frame, -System)%>%
extract(keys, c("X", "Y", "Z", "joint"), "(X$) (Y$) (Z$) ([A-Z].$)")%>%
spread(X, values)
我找到了几个关于转换的好问题和答案,但没有一个专门针对正则表达式的使用。
【问题讨论】:
-
@Gregor 我认为它指的是
tidyr::extract,很容易混淆dplyr中的具体内容和更广泛的tidyverse中的内容 -
一直很困惑。由于 rlang 使用的是
:=,所以早些时候被绊倒了,但我认为data.table -
@Marius - 阅读您的评论我意识到我犯了一个错误。我一直认为 extract 是 dplyr 的一部分,但 here 我发现它实际上是 tidyr 的一部分。帖子已编辑。