在同一数据帧中收集两次

时间:2018-11-26 22:14:29

标签: r tidyverse tidyr

我有一个数据框,我想在其中进行两个单独的收集

library(tidyverse)
id <- c("A","B","C","D","E")
test_1_baseline <- c(1,2,4,5,6)
test_2_baseline <- c(21000, 23400, 26800,29000,30000)
test_1_followup <- c(0,4,2,3,1)
test_2_followup <- c(10000,12000,13000,15000,21000)
layout_1 <-data.frame(id,test_1_baseline,test_1_followup,test_2_baseline,test_2_followup)

这是当前布局。 每个人是1行。 基准测试1的结果是一个变量 基准测试2的结果是第二个变量 测试1/2的随访结果也是如此

我希望数据整洁。一列用于时间点,一列用于测试A的结果,一列用于测试B的结果。

id2 <- c("A","B","C","D","E","A","B","C","D","E")
time <- c(rep("baseline",5),rep("followup",5))
test_1_result <- c(1,2,4,5,6,0,4,2,3,1)
test_2_result <- c(21000, 23400, 26800,29000,30000,10000,12000,13000,15000,21000)
layout_2 <- data.frame(id2, time,test_1_result,test_2_result)

我目前正在做一个我觉得很奇怪的过程,首先我要收集测试1的数据

test_1 <-  select(layout_1,id,test_1_baseline,test_1_followup) %>%
  gather("Timepoint","test_1",c(test_1_baseline,test_1_followup)) %>% 
  mutate(Timepoint = replace(Timepoint,Timepoint=="test_1_baseline", "baseline")) %>%
  mutate(Timepoint = replace(Timepoint,Timepoint=="test_1_followup", "followup"))

然后我对测试2进行相同操作并加入他们

test_2 <- select(layout_1,id,test_2_baseline,test_2_followup) %>%
  gather("Timepoint","test_2",c(test_2_baseline,test_2_followup)) %>% 
  mutate(Timepoint = replace(Timepoint,Timepoint=="test_2_baseline", "baseline")) %>%
  mutate(Timepoint = replace(Timepoint,Timepoint=="test_2_followup", "followup"))   

test_combined <- full_join(test_1,test_2)

我尝试在相同的数据帧上进行第一个Gather,然后进行第二个Gather,但是最终结果是重复的;即您最终会得到

  1. ID 1测试_1基准Test_2基准
  2. ID 1测试_1基准测试_2跟踪
  3. ID 1测试_1后续测试_2
  4. 基准ID 1测试_1跟踪测试_2跟踪 == 4行,应该只有2行

我觉得必须有一种更简洁的方法来做到这一点。 欢迎指导

2 个答案:

答案 0 :(得分:3)

使用data.table的{​​{1}}的一个选项可能需要多个melt measure

patterns

答案 1 :(得分:1)

您可以gatherid以外的所有列,然后使用separate划分结果和时间。

请注意,此代码假定结果名称始终为6个字符(test_1test_2),并根据该假设进行分隔。如果不是这种情况,则需要设计一个不同的separate

library(tidyr)
library(dplyr)

layout_1 %>% 
  gather(Var, Val, -id) %>% 
  separate(Var, into = c("result", "time"), sep = 6) %>% 
  spread(result, Val) %>% 
  mutate(time = gsub("_", "", time))

结果:

   id     time test_1 test_2
1   A baseline      1  21000
2   A followup      0  10000
3   B baseline      2  23400
4   B followup      4  12000
5   C baseline      4  26800
6   C followup      2  13000
7   D baseline      5  29000
8   D followup      3  15000
9   E baseline      6  30000
10  E followup      1  21000