Reshape/Cast 数据框 - 根据变量和多个值创建新列

Reshape/Cast data frame - create new columns based on variable and multiple values

我有以下示例数据框,我需要对其进行整形,但无法使用整形或转换函数来执行我需要的操作

df
   Testee Gender UniqueIdentifier BirthYear Graph V1 V2 V3 V4
1 7685906      1   33448683-29373      1996     1  4  6  6  5
2      NA     NA                         NA     2  7  2  9  6
3      NA     NA                         NA     3 -3  4 -3 -1
4 7685910      2   33444446-47897      1997     1  8  0  3  4
5      NA     NA                         NA     2  7  9  3  2
6      NA     NA                         NA     3  1 -9  0  2

我想为每个图形(1、2 和 3)转置 V1、V2、V3 和 V4 的行值。所以我需要 12 列:Graph1.V1 Graph1.V2 Graph1.V3 Graph1.V4 Graph2.V1 Graph2.V2 等,但我正在努力使用转换函数

这是期望的输出

df2
   Testee Gender UniqueIdentifier BirthYear X1.V1 X1.V2 X1.V3 X1.V4 X2.V1 X2.V2 X2.V3 X2.V4 X3.V1 X3.V2 X3.V3 X3.V4
1 7685906      1   33448683-29373      1996     4     6     6     5     7     2     9     6    -3     4    -3    -1
2 7685910      2   33444446-47897      1997     8     0     3     4     7     9     3     2     1    -9     0     2

感谢任何帮助!

我们可以把'UniqueIdentifier'中的空白元素改成'NA',用na.locf把前4个'NA'值转换成前面的非NA元素使用 lapply 循环列,然后使用 data.table 中的 dcast(在将 'data.frame' 转换为 'data.table' (setDT(df1)) 之后)取多个 value.var 列。

df1$UniqueIdentifier[df1$UniqueIdentifier==''] <- NA
library(zoo)
df1[1:4] <- lapply(df1[1:4], na.locf)

library(data.table)
dcast(setDT(df1), Testee+Gender+UniqueIdentifier+BirthYear~Graph, 
                        value.var=c('V1', 'V2', 'V3', 'V4'))
#    Testee Gender UniqueIdentifier BirthYear V1_1 V1_2 V1_3 V2_1 V2_2 V2_3 V3_1
#1: 7685906      1   33448683-29373      1996    4    7   -3    6    2    4    6
#2: 7685910      2   33444446-47897      1997    8    7    1    0    9   -9    3
#       V3_2 V3_3 V4_1 V4_2 V4_3
# 1:    9   -3    5    6   -1
# 2:    3    0    4    2    2

或者用na.locf预处理后,我们可以使用base R

中的reshape
 reshape(df1, idvar=c('Testee', 'Gender', 
       'UniqueIdentifier', 'BirthYear'), 
          timevar='Graph',direction='wide')
 #   Testee Gender UniqueIdentifier BirthYear V1.1 V2.1 V3.1 V4.1 V1.2 V2.2 V3.2 V4.2 V1.3 V2.3 V3.3 V4.3
 #1 7685906      1   33448683-29373      1996    4    6    6    5    7    2    9    6   -3    4   -3   -1
 #4 7685910      2   33444446-47897      1997    8    0    3    4    7    9    3    2    1   -9    0    2