我有一个数据框,我想在其中进行两个单独的收集
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,但是最终结果是重复的;即您最终会得到
我觉得必须有一种更简洁的方法来做到这一点。 欢迎指导
答案 0 :(得分:3)
使用data.table
的{{1}}的一个选项可能需要多个melt
measure
patterns
答案 1 :(得分:1)
您可以gather
除id
以外的所有列,然后使用separate
划分结果和时间。
请注意,此代码假定结果名称始终为6个字符(test_1
,test_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