R 传播多个嵌套组的控件
这是前一篇文章的后续问题 对于我的玩具问题,我从@akrun那里得到了一套很好的答案,但当我仔细研究这个答案时,我意识到它实际上还不适用于现实生活中的问题。此问题说明仍然正确:: 之前: 之后: 进一步的挑战是“grp”和“治疗”变量正是我所描述的级别,因为这些是控制需要传播的地方。事实上,有四个额外的分组变量与组处于同一水平,每个变量都有自己的阳性和阴性对照组 因此,这个问题的解决方案不可能是识别所有的阴性/阳性对照,并将它们附加到每个组中。执行解决方案时需要考虑分组,然后在所有组之间适当传播。由于DPLYR似乎非常适合这种类型的方法,我认为这是走的路,但我有点困在中间。对我来说,这建议了一种purrr解决方案,但除了R 传播多个嵌套组的控件,r,dplyr,purrr,R,Dplyr,Purrr,这是前一篇文章的后续问题 对于我的玩具问题,我从@akrun那里得到了一套很好的答案,但当我仔细研究这个答案时,我意识到它实际上还不适用于现实生活中的问题。此问题说明仍然正确:: 之前: 之后: 进一步的挑战是“grp”和“治疗”变量正是我所描述的级别,因为这些是控制需要传播的地方。事实上,有四个额外的分组变量与组处于同一水平,每个变量都有自己的阳性和阴性对照组 因此,这个问题的解决方案不可能是识别所有的阴性/阳性对照,并将它们附加到每个组中。执行解决方案时需要考虑分组,然后在所有组之间适当
reduce()
之外,我根本没有使用过purrr。或者可能是一个groupby()%%>%nest%%>%…%%>%unnest
该怎么办
library(tidyverse)
data_propagated_controls <- data %>%
# \\ group the data by all the grouping variables
# \\ exclude the 'treatment' variables
group_by(var1, var2, var3) %>%
# \\ split into individual dataframes
group_split() %>%
# \\ for each list item propagate controls
# \\ similar as the problem described below
# \\ steps to run in pseudocode
identify and extract controls
append controls to each treatment
add a column to distinguish treatment/controls
join all treatments/controls by rbind
# \\ reassemble the dataframe from the list
# \\ reduce with rbind or full_join should work
reduce(split, rbind)
库(tidyverse)
数据\u传播\u控件%
#\\n按所有分组变量对数据分组
#\\排除“治疗”变量
分组依据(var1、var2、var3)%>%
#\\拆分为单个数据帧
组分割()%>%
#\\对于每个列表项传播控件
#\\与下面描述的问题类似
#\\在伪代码中运行的步骤
识别并提取控件
将控制添加到每个治疗
添加一列以区分治疗/对照
通过rbind加入所有治疗/控制
#\\n从列表中重新组装数据帧
#\\reduce with rbind或full\u连接应该可以工作
减少(拆分,rbind)
上一篇文章中的问题说明:
librar(ggplot)
before <- structure(list(group = c("grp1", "grp1", "grp1", "grp1",
"grp2", "grp2", "grp2", "grp2", "grp3", "grp3", "grp3", "grp3",
"neg", "neg", "pos", "pos"), treatment = c("A", "B", "C",
"D", "A", "B", "C", "D", "A", "B", "C", "D", "none", "none",
"none", "none"), value = c(3L, 5L, 7L, 9L, 2L, 4L, 6L, 8L, 3L,
4L, 6L, 9L, 12L, 10L, 1L, 2L)), class = "data.frame", row.names = c(NA, -16L))
ggplot(data = before, aes(x=treatment, y=value)) + geom_boxplot() + facet_wrap (~group)
after <- structure(list(group = c("grp1", "grp1", "grp1", "grp1", "grp1", "grp1",
"grp1", "grp1", "grp2", "grp2", "grp2", "grp2", "grp2", "grp2",
"grp2", "grp2", "grp3", "grp3", "grp3", "grp3", "grp3", "grp3",
"grp3", "grp3"), treatment = c("A", "B", "C", "D", "neg", "neg",
"pos", "pos", "A", "B", "C", "D", "neg", "neg", "pos", "pos",
"A", "B", "C", "D", "neg", "neg", "pos", "pos"), value = c(3L,
5L, 7L, 9L, 12L, 10L, 1L, 2L, 2L, 4L, 6L, 8L, 12L, 10L, 1L, 2L,
3L, 4L, 6L, 9L, 12L, 10L, 1L, 2L)), class = "data.frame", row.names = c(NA, -24L))
ggplot(data = after, aes(x=treatment, y=value)) + geom_boxplot() + facet_wrap (~group)
librar(ggplot)
在之前,我想我找到了一个解决办法。它利用嵌套数据帧和“full_join”的整洁函数,将缺失值传播到适当的缺失点
对于我的代码,Drug\u ID==“DMSO”
表示应该在所有其他Drug\u ID中传播的对照治疗。列Cell_Line_ID、DOX_ID和time包含额外的分组变量,每个分组变量对于每个单独的条件都有各自的控制值
现在,这很好地允许我在每个时间点和条件将控件绘制到绘图的每个方面。我现在的最后一个问题是获得更多关于控件值的控制。如果它与一系列其他指标重叠,就很难看到。ggplot需要为特定元素提供“将_带到_前端”功能
#//生成仅包含所有相关控件的列表列表
温度系数%
#//使用单独的DMSO控件按变量分组
分组依据(单元格行ID、DOX ID、时间)%>%
#//识别并过滤所有控件
过滤器(药物控制!=“无”)%>%
#//删除药物标识的列
选择(-Drug_ID)%%>%
#//将组拆分为单个列表
nest()
#//将数据列的名称更改为dmso
名称(临时中心)[[其中(名称(临时中心)==“数据”)]%
#//将组拆分为单个列表
nest()
#//按单元格行、DOX和时间合并两个嵌套列表
数据%
#//将所有内容卸载到单个数据帧中
unnest()
#//清理
rm(温度控制、数据列表)
考虑过这一点后,我想我可以用多种方法来解决这个问题。或者我只是在group\u by
和group\u split
之后获取列表,然后通过lapply运行一些附加函数,以添加到数据集,如所述。或者,我可以在拆分列表中的分组数据帧上通过lappy
生成我喜欢的图,甚至不修改数据集。很高兴你能找到它,我还通过绘制一个完全独立的geom_平滑
层,完全控制了控制线与治疗线的设计。这一切都是如此强大。真希望我十年前就学会了这一点!
#// generate a list of lists that contains all relevant controls only
temp_ctrls <- data %>%
#// group by variables with separate DMSO controls
group_by(Cell_Line_ID, DOX_ID, time) %>%
#// identify and filter all controls
filter(Drug_control != "none") %>%
#// remove column for Drug_ID
select(-Drug_ID) %>%
#// split groups into individual lists
nest()
#// change names of data column to dmso
names(temp_ctrls)[[which(names(temp_ctrls)=="data")]] <- "ctrl"
#// generate a list of lists that contains all data that needs appending
data_list <- data %>%
#// group by variables now including Drug_ID
group_by(Cell_Line_ID, DOX_ID, time, Drug_ID) %>%
#// split groups into individual lists
nest()
#// merge two nested lists by Cell_Line, DOX, and time
data_m <- full_join(data_list, temp_ctrls)
#// remove all list items with Drug_ID DMOS
data_m <- filter(data_m, Drug_ID != "DMSO")
#// assemble control and data and unnest
data_m <- data_m %>%
#// create new list column with merged data + ctrl
mutate(merged = map2(data, ctrl, rbind)) %>%
#// remove extraneous data columns
select(-data, -ctrl) %>%
#// unnest everything into a single dataframe
unnest()
#// clean-up
rm(temp_ctrls, data_list)