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