Base R reshape() 与 tidyverse
Base R reshape() versus tidyverse
最近我四处寻找一种快速的方法,可以从包含患者数据的宽数据帧中创建一个长数据帧,每个患者有多个测量值(比如心率、血压和饱和度评分)五天)。在四处搜索时,我曾期望从 tidyverse and/or 的 reshape2 包中找到许多解决方案。但是,我实际上从 base-R 中找到了 this gem。
现在我不能放弃尝试使用 tidyverse and/or reshape2 中的一个或多个包来寻找同样好的 "one-liner"。到目前为止,没有什么比这更好的了,我会很感激你的提示。请注意,这个问题明确地是关于 pretty/neat 的巧妙解决方案,而不是找到实际的解决方案。
来自链接的数据 post:
id <- paste('x', "1.", 1:10, sep="")
set.seed(10)
DF <- data.frame(id, trt=sample(c('cnt', 'tr'), 10, T), work.T1=runif(10),
play.T1=runif(10), talk.T1=runif(10), total.T1=runif(10),
work.T2=runif(10), play.T2=runif(10), talk.T2=runif(10),
total.T2=runif(10))
我认为没有单一函数调用的 tidyverse 解决方案,但好的解决方案也没有那么复杂。我们需要先收集,然后把时间和钥匙分开,然后再传回来。
DF %>%
gather(key, val, -id, -trt) %>%
separate(key, c('key', 'time')) %>%
spread(key, val)
id trt time play talk total work
1 x1.1 tr T1 0.86472123 0.53559704 0.27548386 0.65165567
2 x1.1 tr T2 0.03188816 0.07557029 0.86138244 0.35432806
3 x1.10 cnt T1 0.35589774 0.50050323 0.80154700 0.83613414
4 x1.10 cnt T2 0.21913855 0.20795168 0.17015172 0.50528560
5 x1.2 cnt T1 0.61535242 0.09308813 0.22890394 0.56773775
6 x1.2 cnt T2 0.11446759 0.53442678 0.46439198 0.93643254
7 x1.3 cnt T1 0.77510990 0.16980304 0.01443391 0.11350898
8 x1.3 cnt T2 0.46893548 0.64135658 0.22286743 0.24586639
9 x1.4 tr T1 0.35556869 0.89983245 0.72896456 0.59592531
10 x1.4 tr T2 0.39698674 0.52573932 0.62354960 0.47314146
11 x1.5 cnt T1 0.40584997 0.42263761 0.24988047 0.35804998
12 x1.5 cnt T2 0.83361919 0.03928139 0.20364770 0.19156087
13 x1.6 cnt T1 0.70664691 0.74774647 0.16118328 0.42880942
14 x1.6 cnt T2 0.76112174 0.54585984 0.01967341 0.58322197
15 x1.7 cnt T1 0.83828767 0.82265258 0.01704265 0.05190332
16 x1.7 cnt T2 0.57335645 0.37276310 0.79799301 0.45947319
17 x1.8 cnt T1 0.23958913 0.95465365 0.48610035 0.26417767
18 x1.8 cnt T2 0.44750805 0.96130241 0.27431890 0.46743405
19 x1.9 tr T1 0.77077153 0.68544451 0.10290017 0.39879073
20 x1.9 tr T2 0.08380201 0.25734157 0.16660910 0.39983256
最近我四处寻找一种快速的方法,可以从包含患者数据的宽数据帧中创建一个长数据帧,每个患者有多个测量值(比如心率、血压和饱和度评分)五天)。在四处搜索时,我曾期望从 tidyverse and/or 的 reshape2 包中找到许多解决方案。但是,我实际上从 base-R 中找到了 this gem。
现在我不能放弃尝试使用 tidyverse and/or reshape2 中的一个或多个包来寻找同样好的 "one-liner"。到目前为止,没有什么比这更好的了,我会很感激你的提示。请注意,这个问题明确地是关于 pretty/neat 的巧妙解决方案,而不是找到实际的解决方案。
来自链接的数据 post:
id <- paste('x', "1.", 1:10, sep="")
set.seed(10)
DF <- data.frame(id, trt=sample(c('cnt', 'tr'), 10, T), work.T1=runif(10),
play.T1=runif(10), talk.T1=runif(10), total.T1=runif(10),
work.T2=runif(10), play.T2=runif(10), talk.T2=runif(10),
total.T2=runif(10))
我认为没有单一函数调用的 tidyverse 解决方案,但好的解决方案也没有那么复杂。我们需要先收集,然后把时间和钥匙分开,然后再传回来。
DF %>%
gather(key, val, -id, -trt) %>%
separate(key, c('key', 'time')) %>%
spread(key, val)
id trt time play talk total work 1 x1.1 tr T1 0.86472123 0.53559704 0.27548386 0.65165567 2 x1.1 tr T2 0.03188816 0.07557029 0.86138244 0.35432806 3 x1.10 cnt T1 0.35589774 0.50050323 0.80154700 0.83613414 4 x1.10 cnt T2 0.21913855 0.20795168 0.17015172 0.50528560 5 x1.2 cnt T1 0.61535242 0.09308813 0.22890394 0.56773775 6 x1.2 cnt T2 0.11446759 0.53442678 0.46439198 0.93643254 7 x1.3 cnt T1 0.77510990 0.16980304 0.01443391 0.11350898 8 x1.3 cnt T2 0.46893548 0.64135658 0.22286743 0.24586639 9 x1.4 tr T1 0.35556869 0.89983245 0.72896456 0.59592531 10 x1.4 tr T2 0.39698674 0.52573932 0.62354960 0.47314146 11 x1.5 cnt T1 0.40584997 0.42263761 0.24988047 0.35804998 12 x1.5 cnt T2 0.83361919 0.03928139 0.20364770 0.19156087 13 x1.6 cnt T1 0.70664691 0.74774647 0.16118328 0.42880942 14 x1.6 cnt T2 0.76112174 0.54585984 0.01967341 0.58322197 15 x1.7 cnt T1 0.83828767 0.82265258 0.01704265 0.05190332 16 x1.7 cnt T2 0.57335645 0.37276310 0.79799301 0.45947319 17 x1.8 cnt T1 0.23958913 0.95465365 0.48610035 0.26417767 18 x1.8 cnt T2 0.44750805 0.96130241 0.27431890 0.46743405 19 x1.9 tr T1 0.77077153 0.68544451 0.10290017 0.39879073 20 x1.9 tr T2 0.08380201 0.25734157 0.16660910 0.39983256