我希望能够对所有列或特定列执行简单的运算,例如除法或乘法,方法是基于一个条件(例如另一行上的匹配ID)使用一个或多个列的同一数据框的子集。
我有关于不同处理的酵母培养物的光密度值(OD)的数据,其中每列是不同时间点的光密度值,可以总结为:
DF <- data.frame(Time=c(1,2,3,4,5,6,7),
A1=c(40,50,60,70,80,90,100),
A2=c(40,50,60,70,80,90,100),
A3=c(20,40,50,60,70,80,90),
B1=c(20,40,50,60,70,80,90),
B2=c(10,20,30,40,50,60,70),
B3=c(14,22,37,45,52,65,73),
C1=c(25,30,41,49,64,71,83),
C2=c(24,30,41,50,63,72,80),
C3=c(28,33,47,51,67,72,88))
字符串
我还有另一个数据框,其中包含每列的相关信息:
INFO<- data.frame(Well=c("A1","A2","A3","B1","B2","B3","C1","C2","C3"),
Strain=rep(c("L","M","N"),times=3),
Treatment=rep(c("0X","X","2X"),each=3))
型
我必须做的一件事是通过对照处理标准化OD值。在这个例子中,它将是“X”。这意味着我必须将每个值(包括对照处理)除以正确时间点和应变的对照处理的相应值。
我解决这个问题的方法是用cbind
创建第二个框架,并重复添加治疗列,如下所示:
normingOD<-DF[,5:7]
normingOD<-cbind(normingOD,normingOD,normingOD)
normOD<-DF[-1]/normingOD
normOD$Time<-DF$Time
型
这应该提取对应于治疗“X”的列,将它们绑定3次,使它们匹配数据集的大小减去第一列,然后将“DF”除以“normingOD”。这应该有效,因为位置应该匹配,对于时间点和菌株。
我认为这是非常无效的,我想看看是否有更好的方法来做到这一点,因为我的真实的数据集有96列和数千个观察值,而控制处理实际上是其中的12列。我如何才能使其更清晰??
后来,我做了一个很长的格式来处理dplyr
,像这样:
library(reshape2)
library(dplyr)
Ndata <- reshape2::melt(normOD , id.vars = 'Time', variable.name = 'Well')
DATA<-merge(Ndata,INFO,by="Well")
型
在这一点上,我还想添加一个新的列,以百分比形式显示生长差异,但与治疗“0X”的值进行比较。这意味着以某种方式告诉R
每个 * 值 * 必须乘以100,然后除以对应于相同 * 时间 * 的 * 值 *,但对于 * 治疗 * =“X 0”和相同菌株。作为示例,井==B1,时间==1,处理==X(值==2)和应变==L的值我将其除以井==A1,时间==1,处理==0X和应变==L(值==1)中的值。如果我做得正确,它应该得到给予perc_growth==50,因为它是X 0处理中值的50%。
我再次通过制作一个具有相应值的向量来将其像这样除以:
vector<-DATA[rep(1:7,9),3]
DATA<-cbind(DATA,vector)
DATA<-DATA%>%
mutate(perc_growth=(value*100)/vector)
型
这将提取一个向量,其中包含“Strain”“L”和“Treatment”“0X”的值,并重复9次以匹配该矩阵的大小,这样我就可以再次将其用作一个列来除以。
是否有一个更简单,更干净的方式来做这件事,在dupiter或类似的?我很可能会在更多的场合这样做,所以我真的想找到一个更好的方式写这些东西的正确方法!!
我感谢你的期待,我道歉,如果出于某种原因,我没有找到一个职位已经回答这个问题。
1条答案
按热度按时间dwthyt8l1#
我认为你尝试从宽到长是一个好主意-我认为你应该先这样做,然后将
INFO
连接到长数据:字符串
我相信这就是你想要的增长计算:
型
在这一点上,我不明白规范计算,但如果你解释它多一点,我可以编辑,以显示如何做到这一点。