使用gather()创建单独的整齐列

使用gather()创建单独的整齐列,r,tidyr,R,Tidyr,我有姿势血压数据(3个时间点的脉搏、收缩和舒张),以及一些关键的其他变量,我想创建整洁的血压数据版本 我曾尝试对单个变量类型(例如,systolic)使用gather(),但在执行所有3个变量类型时(59个原始参与者,在将三个gather()函数连接在一起时变为1593个变量)都不起作用 库(tidyverse) ID这可以用tidyverse来完成,但是用好的base::重塑要容易得多: v <- list(c("diastolic_lying", "diastolic_standing

我有姿势血压数据(3个时间点的脉搏、收缩和舒张),以及一些关键的其他变量,我想创建整洁的血压数据版本

我曾尝试对单个变量类型(例如,systolic)使用gather(),但在执行所有3个变量类型时(59个原始参与者,在将三个gather()函数连接在一起时变为1593个变量)都不起作用

库(tidyverse)

ID这可以用
tidyverse
来完成,但是用好的
base::重塑
要容易得多:

v <- list(c("diastolic_lying", "diastolic_standing_1", "diastolic_standing_3"), 
          c("pulse_lying", "pulse_lying_1", "pulse_lying_3"), 
          c("systolic_lying", "systolic_standing_1", "systolic_standing_3"))

reshape(as.data.frame(bp), 
        v, 
        direction = "long", 
        v.names   = c("diastolic", "pulse", "systolic"), 
        times     = c("lying", "standing_1", "standing_3"), 
        idvar     = "ID", 
        timevar   = "type") %>% 
as_tibble()
# A tibble: 15 x 7
#       ID group measure_1 type       diastolic pulse systolic
#    <dbl> <dbl>     <dbl> <chr>          <dbl> <dbl>    <dbl>
#  1  1138     1         8 lying             80    58      169
#  2   430     1        14 lying             93    71      141
#  3   245     2         6 lying             80    58      144
#  4  1431     3        11 lying             71    63      120
#  5  1587     4        28 lying             66    98       88
#  6  1138     1         8 standing_1        87    62      163
#  7   430     1        14 standing_1        97    93      156
#  8   245     2         6 standing_1        79    61      129
#  9  1431     3        11 standing_1        77    70      127
# 10  1587     4        28 standing_1        75    73      102
# 11  1138     1         8 standing_3        92    67      179
# 12   430     1        14 standing_3       100    97      152
# 13   245     2         6 standing_3        83    63      146
# 14  1431     3        11 standing_3        79    71      127
# 15  1587     4        28 standing_3        77    76      106
v%
作为_tible()
#一个tibble:15x7
#ID组测量1型舒张压和收缩压
#                          
#1113818卧位8058169
#2430114卧位9371141
#3245 26卧位8058 144
#414313 11躺着7163 120
#51587428躺着669888
#6113818常设会议18762163
#743014常设会议19793156
#8245 2 6常设会议179 61 129
#914313 11常设会议177 70 127
#101587428常设法庭17573102
#11113818常设委员会39267179
#12 430 1 14常设单位3 100 97 152
#13 245 2 6常设单位3 83 63 146
#14 1431 3 11常设会议3 79 71 127
#15 1587 4 28常设论坛3 77 76 106

这可以用
tidyverse
来完成,但使用好的旧
基础::重塑
:

v <- list(c("diastolic_lying", "diastolic_standing_1", "diastolic_standing_3"), 
          c("pulse_lying", "pulse_lying_1", "pulse_lying_3"), 
          c("systolic_lying", "systolic_standing_1", "systolic_standing_3"))

reshape(as.data.frame(bp), 
        v, 
        direction = "long", 
        v.names   = c("diastolic", "pulse", "systolic"), 
        times     = c("lying", "standing_1", "standing_3"), 
        idvar     = "ID", 
        timevar   = "type") %>% 
as_tibble()
# A tibble: 15 x 7
#       ID group measure_1 type       diastolic pulse systolic
#    <dbl> <dbl>     <dbl> <chr>          <dbl> <dbl>    <dbl>
#  1  1138     1         8 lying             80    58      169
#  2   430     1        14 lying             93    71      141
#  3   245     2         6 lying             80    58      144
#  4  1431     3        11 lying             71    63      120
#  5  1587     4        28 lying             66    98       88
#  6  1138     1         8 standing_1        87    62      163
#  7   430     1        14 standing_1        97    93      156
#  8   245     2         6 standing_1        79    61      129
#  9  1431     3        11 standing_1        77    70      127
# 10  1587     4        28 standing_1        75    73      102
# 11  1138     1         8 standing_3        92    67      179
# 12   430     1        14 standing_3       100    97      152
# 13   245     2         6 standing_3        83    63      146
# 14  1431     3        11 standing_3        79    71      127
# 15  1587     4        28 standing_3        77    76      106
v%
作为_tible()
#一个tibble:15x7
#ID组测量1型舒张压和收缩压
#                          
#1113818卧位8058169
#2430114卧位9371141
#3245 26卧位8058 144
#414313 11躺着7163 120
#51587428躺着669888
#6113818常设会议18762163
#743014常设会议19793156
#8245 2 6常设会议179 61 129
#914313 11常设会议177 70 127
#101587428常设法庭17573102
#11113818常设委员会39267179
#12 430 1 14常设单位3 100 97 152
#13 245 2 6常设单位3 83 63 146
#14 1431 3 11常设会议3 79 71 127
#15 1587 4 28常设论坛3 77 76 106

使用
tidyverse
这并不难实现,而且不依赖于参数,因此当数据发生变化(额外测量)时,代码将继续工作


library(tidyverse)

ID <- c(1138, 430, 245, 1431, 1587)
group <- c(1, 1, 2, 3, 4)
measure_1 <- c(8, 14, 6, 11, 28)
systolic_lying <- c(169, 141, 144, 120, 88)
systolic_standing_1 <- c(163, 156, 129, 127, 102)
systolic_standing_3 <- c(179, 152, 146, 127, 106)
diastolic_lying <- c(80, 93, 80, 71, 66)
diastolic_standing_1 <-c(87, 97, 79, 77, 75)
diastolic_standing_3 <-c(92, 100, 83, 79, 77)
pulse_lying <-c(58, 71, 58, 63, 98)
pulse_standing_1 <- c(62, 93, 61, 70, 73)
pulse_standing_3 <- c(67, 97, 63, 71, 76)

bp <- tibble(ID, group, measure_1, systolic_lying, systolic_standing_1, systolic_standing_3, 
             diastolic_lying, diastolic_standing_1, diastolic_standing_3, 
             pulse_lying, pulse_standing_1, pulse_standing_3)

bp %>%
  gather(key, value, -ID, -group,-measure_1) %>%
  mutate(posture = str_extract(key,'(?<=[a-z]{1,20}_).+'),
         measure = str_extract(key,'^[a-z]+(?=_)')) %>%
  group_by(ID, group,measure_1,posture) %>%
  select(-key) %>%
  spread(measure, value) %>%
  arrange(posture)


使用
tidyverse
实现起来并不难,而且不依赖于参数,因此当数据发生变化(额外测量)时,代码将继续工作


library(tidyverse)

ID <- c(1138, 430, 245, 1431, 1587)
group <- c(1, 1, 2, 3, 4)
measure_1 <- c(8, 14, 6, 11, 28)
systolic_lying <- c(169, 141, 144, 120, 88)
systolic_standing_1 <- c(163, 156, 129, 127, 102)
systolic_standing_3 <- c(179, 152, 146, 127, 106)
diastolic_lying <- c(80, 93, 80, 71, 66)
diastolic_standing_1 <-c(87, 97, 79, 77, 75)
diastolic_standing_3 <-c(92, 100, 83, 79, 77)
pulse_lying <-c(58, 71, 58, 63, 98)
pulse_standing_1 <- c(62, 93, 61, 70, 73)
pulse_standing_3 <- c(67, 97, 63, 71, 76)

bp <- tibble(ID, group, measure_1, systolic_lying, systolic_standing_1, systolic_standing_3, 
             diastolic_lying, diastolic_standing_1, diastolic_standing_3, 
             pulse_lying, pulse_standing_1, pulse_standing_3)

bp %>%
  gather(key, value, -ID, -group,-measure_1) %>%
  mutate(posture = str_extract(key,'(?<=[a-z]{1,20}_).+'),
         measure = str_extract(key,'^[a-z]+(?=_)')) %>%
  group_by(ID, group,measure_1,posture) %>%
  select(-key) %>%
  spread(measure, value) %>%
  arrange(posture)


编辑:我最初的解决方案使用左键连接,产生了不良影响,制作了许多数据副本。更正如下

我想这就是你要寻找的输出,在这里我们可以看到所有三种姿势以及每种姿势的配对值

在本例中,我使用
bind\u cols
将三个键值对组合成您描述的格式

select(bp, ID:measure_1, systolic_lying:systolic_standing_3) %>%
gather("systolic_posture", "systolic", -c(ID:measure_1)) %>%

bind_cols(select(bp, ID:measure_1, diastolic_lying:diastolic_standing_3) %>%
            gather("diastolic_posture", "diastolic", -c(ID:measure_1)) %>%
            select(-c(ID:measure_1))) %>%

bind_cols(select(bp, ID:measure_1, pulse_lying:pulse_lying_3) %>%
            gather("pulse_posture", "pulse", -c(ID:measure_1)) %>%
            select(-c(ID:measure_1)))


# A tibble: 15 x 9
   ID group measure_1 systolic_posture    systolic diastolic_posture    diastolic pulse_posture pulse
   <dbl> <dbl>     <dbl> <chr>                  <dbl> <chr>                    <dbl> <chr>         <dbl>
 1  1138     1         8 systolic_lying           169 diastolic_lying             80 pulse_lying      58
 2   430     1        14 systolic_lying           141 diastolic_lying             93 pulse_lying      71
 3   245     2         6 systolic_lying           144 diastolic_lying             80 pulse_lying      58
 4  1431     3        11 systolic_lying           120 diastolic_lying             71 pulse_lying      63
 5  1587     4        28 systolic_lying            88 diastolic_lying             66 pulse_lying      98
 6  1138     1         8 systolic_standing_1      163 diastolic_standing_1        87 pulse_lying_1    62
 7   430     1        14 systolic_standing_1      156 diastolic_standing_1        97 pulse_lying_1    93
 8   245     2         6 systolic_standing_1      129 diastolic_standing_1        79 pulse_lying_1    61
 9  1431     3        11 systolic_standing_1      127 diastolic_standing_1        77 pulse_lying_1    70
10  1587     4        28 systolic_standing_1      102 diastolic_standing_1        75 pulse_lying_1    73
11  1138     1         8 systolic_standing_3      179 diastolic_standing_3        92 pulse_lying_3    67
12   430     1        14 systolic_standing_3      152 diastolic_standing_3       100 pulse_lying_3    97
13   245     2         6 systolic_standing_3      146 diastolic_standing_3        83 pulse_lying_3    63
14  1431     3        11 systolic_standing_3      127 diastolic_standing_3        79 pulse_lying_3    71
15  1587     4        28 systolic_standing_3      106 diastolic_standing_3        77 pulse_lying_3    76
select(血压,ID:measure1,收缩期卧位:收缩期卧位3)%>%
聚集(“收缩期_姿势”、“收缩期”、-c(ID:measure_1))%>%
绑定cols(选择(血压,ID:measure_1,舒张期:舒张期_3)%>%
聚集(“舒张期体位”、“舒张期”、-c(ID:measure_1))%>%
选择(-c(ID:measure_1)))%>%
绑定列(选择(bp,ID:测量列1,脉冲列:脉冲列3)%>%
聚集(“脉冲姿态”、“脉冲”、-c(ID:measure_1))%>%
选择(-c(ID:measure_1)))
#A tibble:15x9
ID组测量\u 1收缩\u体位收缩舒张\u体位舒张脉搏\u体位脉搏
1113818收缩压169舒张压80脉搏压58
243014收缩压141舒张压93脉搏压71
3245 2 6收缩压144舒张压80脉压58
4 1431 3 11收缩压压压120舒张压71脉搏压63
51587 4 28收缩压88舒张压66脉搏压98
611381 8收缩压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压
7430 114收缩压、舒张压、脉搏压
8245 2 6收缩压和舒张压和脉搏压
9 1431 3 11收缩压和舒张压和脉搏
101587 4 28收缩压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压
11 1138 1 8收缩压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压
12430 114收缩压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压
13 245 2 6收缩压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压
14 1431 3 11收缩压和舒张压和脉搏压
15 1587 4 28收缩压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压压

编辑:我最初的解决方案使用左键连接,产生了不良影响,制作了许多数据副本。更正如下

我想这是你的输出