R:根据另一列中的值在新数据框列中添加值

时间:2013-12-04 09:09:25

标签: r dataframe

我在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

感谢您的帮助!

2 个答案:

答案 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个