我在R,df1和df2中有2个数据帧。
df1在每行中表示实验中的一个主题。它有3列。前两列指定主题所在的组的组合。第三列包含实验结果。
df2包含可用于标准化的每个组合组合的值。因此,它有三列,两组用于组,第三列用于归一化常数。
现在我想在df1中创建第四列,第三列的实验结果除以df2中的标准化常量。我该如何促进这一点?
以下是一个例子:
df1 <- data.frame(c(1,1,1,1),c(1,2,1,2),c(10,11,12,13))
df2 <- data.frame(c(1,1,2,2),c(1,2,1,2),c(30,40,50,60))
names(df1)<-c("Group1","Group2","Result")
names(df2)<-c("Group1","Group2","NormalizationConstant")
结果,我需要在df1中使用c(10 / 30,11 / 40,12 / 30,13 / 40)的新列。
我的第一次尝试是使用以下代码,我的实际数据失败,错误消息为“In is.na(e1)| is.na(e2):较长对象的长度不是多个更短的对象的长度“。然而,当我用固定值替换referrer == df1 [,1]和== df1 [,2]时,它可以工作。这真的只返回此特定行的列值吗?
df1$NormalizedResult<- df1$Result / df2[df2[,1]==df1[,1] & df2[,2]==df1[,2],]$NormalizationConstant
感谢您的帮助!
答案 0 :(得分:1)
在这种情况下,这些组完全对齐,就像这样简单:
> df1$expnormed <- df1$Result/df2$NormalizationConstant
> df1
Group1 Group2 Result expnormed
1 1 1 10 0.3333333
2 1 2 11 0.2750000
3 1 1 12 0.2400000
4 1 2 13 0.2166667
如果它们没有完全对齐,您可以使用merge
:
> dfm <-merge(df1,df2)
> dfm
Group1 Group2 Result NormalizationConstant
1 1 1 10 30
2 1 1 12 30
3 1 2 11 40
4 1 2 13 40
> dfm$expnormed <- with(dfm, Result/NormalizationConstant)
答案 1 :(得分:0)
可能性:
df1$res <- df1$Result/df2$NormalizationConstant[match(do.call("paste", df1[1:2]), do.call("paste", df2[1:2]))]
Group1 Group2 Result res
1 1 1 10 0.3333333
2 1 2 11 0.2750000
3 1 1 12 0.4000000
4 1 2 13 0.3250000
H个