Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 传播多个嵌套组的控件_R_Dplyr_Purrr - Fatal编程技术网

R 传播多个嵌套组的控件

R 传播多个嵌套组的控件,r,dplyr,purrr,R,Dplyr,Purrr,这是前一篇文章的后续问题 对于我的玩具问题,我从@akrun那里得到了一套很好的答案,但当我仔细研究这个答案时,我意识到它实际上还不适用于现实生活中的问题。此问题说明仍然正确:: 之前: 之后: 进一步的挑战是“grp”和“治疗”变量正是我所描述的级别,因为这些是控制需要传播的地方。事实上,有四个额外的分组变量与组处于同一水平,每个变量都有自己的阳性和阴性对照组 因此,这个问题的解决方案不可能是识别所有的阴性/阳性对照,并将它们附加到每个组中。执行解决方案时需要考虑分组,然后在所有组之间适当

这是前一篇文章的后续问题

对于我的玩具问题,我从@akrun那里得到了一套很好的答案,但当我仔细研究这个答案时,我意识到它实际上还不适用于现实生活中的问题。此问题说明仍然正确::

之前:

之后:

进一步的挑战是“grp”和“治疗”变量正是我所描述的级别,因为这些是控制需要传播的地方。事实上,有四个额外的分组变量与组处于同一水平,每个变量都有自己的阳性和阴性对照组

因此,这个问题的解决方案不可能是识别所有的阴性/阳性对照,并将它们附加到每个组中。执行解决方案时需要考虑分组,然后在所有组之间适当传播。由于DPLYR似乎非常适合这种类型的方法,我认为这是走的路,但我有点困在中间。对我来说,这建议了一种purrr解决方案,但除了
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)