R 通过将有条件标识的行中的值复制到新列中来加宽数据框

R 通过将有条件标识的行中的值复制到新列中来加宽数据框,r,R,我有一个荟萃分析的数据集,其中包含一组列中的测试前数据,另一组列中的测试后数据,以及一列条件(即治疗[条件==1]与对照[条件==0])。我需要扩大这个数据集,以便为对照观察的试验前数据和试验后数据创建一组新的列,这些列与原始治疗数据放在一起。这些数据按ID分组。这意味着我只需要有条件地将“控制”的观察值复制到“治疗”观察值旁边的一组列中,但在每个ID组中 我知道这是一种令人讨厌的描述方式,下面是我拥有的数据集示例: data_before.df <- data.frame(ID = c(

我有一个荟萃分析的数据集,其中包含一组列中的测试前数据,另一组列中的测试后数据,以及一列条件(即治疗[条件==1]与对照[条件==0])。我需要扩大这个数据集,以便为对照观察的试验前数据和试验后数据创建一组新的列,这些列与原始治疗数据放在一起。这些数据按ID分组。这意味着我只需要有条件地将“控制”的观察值复制到“治疗”观察值旁边的一组列中,但在每个ID组中

我知道这是一种令人讨厌的描述方式,下面是我拥有的数据集示例:

data_before.df <- data.frame(ID = c(1,1,1,2,2,2,3,3,3),
                         Condition = c(0,1,2,0,1,2,0,1,2),
                         Pre_M = c(1,2,3,4,5,6,7,8,9),
                         Post_M = c(90,80,70,60,50,40,30,20,10))
data_before.df

data\u before.df这里有一个带有
dplyr的选项。按“ID”分组后,创建两个新列,并将“Control”作为列的一部分,方法是在以“M”结尾的列上循环,并对“Condition”为0的值进行子集设置,
解组
筛选
出“Condition”为0的行

library(dplyr)
library(stringr)
data_before.df %>%
    group_by(ID) %>%
    mutate_at(vars(ends_with('M')), list(Control = ~.[Condition == 0])) %>%
    ungroup %>%
    filter(Condition != 0) %>%
    rename_at(vars(ends_with('Control')), ~
             str_replace(., '(.*)_Control', 'Control_\\1'))
# A tibble: 6 x 6
#     ID Condition Pre_M Post_M Control_Pre_M Control_Post_M
#  <dbl>     <dbl> <dbl>  <dbl>         <dbl>          <dbl>
#1     1         1     2     80             1             90
#2     1         2     3     70             1             90
#3     2         1     5     50             4             60
#4     2         2     6     40             4             60
#5     3         1     8     20             7             30
#6     3         2     9     10             7             30

或与
数据的联接。表

library(data.table)
setDT(data_before.df)[Condition != 0][data_before.df[Condition == 0, 
   .(ID, Control_Pre_M = Pre_M, Control_Post_M = Post_M)], on  = .(ID)]
#    ID Condition Pre_M Post_M Control_Pre_M Control_Post_M
#1:  1         1     2     80             1             90
#2:  1         2     3     70             1             90
#3:  2         1     5     50             4             60
#4:  2         2     6     40             4             60
#5:  3         1     8     20             7             30
#6:  3         2     9     10             7             30
merge(subset(data_before.df, Condition != 0), 
   subset(data_before.df, Condition == 0, 
        select = c("ID", "Pre_M", "Post_M")), by = 'ID')
library(data.table)
setDT(data_before.df)[Condition != 0][data_before.df[Condition == 0, 
   .(ID, Control_Pre_M = Pre_M, Control_Post_M = Post_M)], on  = .(ID)]
#    ID Condition Pre_M Post_M Control_Pre_M Control_Post_M
#1:  1         1     2     80             1             90
#2:  1         2     3     70             1             90
#3:  2         1     5     50             4             60
#4:  2         2     6     40             4             60
#5:  3         1     8     20             7             30
#6:  3         2     9     10             7             30