创建两个因素之间相互作用的数据框架

时间:2012-07-10 22:56:01

标签: r

我有两个2x2数据帧。每个数据框中的每一列都是一个因子。

我想创建一个2x8数据框,其中包含每个因素以及因子之间的相互作用。

以下是一个例子:

df1 <- data.frame(V1 = factor(c('a', 'b')), V2 = factor(c('c', 'd')))
df2 <- data.frame(V3 = factor(c('e', 'f')), V4 = factor(c('g', 'h')))
df.combined <- combine(df1, df2)

df.combined将在哪里

V1 V2 V3 V4 V1:V3 V1:V4 V2:V3 V2:V4
 a  c  e  g   a:e   a:g   c:e   c:g
 b  c  f  h   b:f   b:h   d:f   d:h

(我不希望V1:V2或V3:V4互动。不需要这些互动仅仅是我面临的问题的本质。)

是否有一种简洁的方法可以在R中获得df.combined

3 个答案:

答案 0 :(得分:2)

我不确定这是否符合您对“简洁”的定义。

dfc <- cbind(df1,df2)
dfc2<- cbind( dfc, `V1:V3`=interaction(dfc$V1, dfc$V3, sep=":"), 
                   `V1:V4`=interaction(dfc$V1,dfc$V4, sep=":") )
df.combined <- cbind( dfc2, `V2:V3`=interaction(dfc$V2, dfc$V3, sep=":"), 
                            `V2:V4`=interaction(dfc$V2,dfc$V4, sep=":") )
> df.combined
  V1 V2 V3 V4 V1:V3 V1:V4 V2:V3 V2:V4
1  a  c  e  g   a:e   a:g   c:e   c:g
2  b  d  f  h   b:f   b:h   d:f   d:h

(通常不建议在变量名中使用冒号。然后总是需要引用冒号。

答案 1 :(得分:0)

这是一个解决方案。也许不是非常优雅或简洁,但可能有用......

dat <- data.frame(V1=c("a", "b"),
                  V2=c("c", "d"),
                  V3=c("e", "f"), 
                  V4=c("g", "h"))

factor_pairs <- expand.grid(c("V1", "V2"), 
                            c("V3", "V4"),
                            stringsAsFactors=FALSE)

for (i in 1:nrow(factor_pairs)) {
    factor_1 <- factor_pairs[i, 1]
    factor_2 <- factor_pairs[i, 2]
    new_col_name <- paste(factor_1, factor_2, sep=":")
    dat[[new_col_name]] <- paste(dat[[factor_1]], dat[[factor_2]], sep=":")
}

dat
#   V1 V2 V3 V4 V1:V3 V2:V3 V1:V4 V2:V4
# 1  a  c  e  g   a:e   c:e   a:g   c:g
# 2  b  d  f  h   b:f   d:f   b:h   d:h

答案 2 :(得分:0)

如果名称中的冒号不是必需的,则只需要一行代码就可以处理两个数据框的列绑定并创建交互。使用您的两个数据框:

df.combined <- with(c(df1, df2), data.frame(df1, df2, V1:V3, V1:V4, V2:V3, V2:V4))

给出了

  V1 V2 V3 V4 V1.V3 V1.V4 V2.V3 V2.V4
1  a  c  e  g   a:e   a:g   c:e   c:g
2  b  d  f  h   b:f   b:h   d:f   d:h

如果您需要名称中的冒号,则另一个oneliner会将句点更改为冒号:

colnames(df.combined) <- gsub("\\.", ":", colnames(df.combined))

留下最终结果

  V1 V2 V3 V4 V1:V3 V1:V4 V2:V3 V2:V4
1  a  c  e  g   a:e   a:g   c:e   c:g
2  b  d  f  h   b:f   b:h   d:f   d:h