2

我有两个 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 交互。不需要这些交互只是我面临的问题的本质。)

有没有一种简洁的方法可以进入df.combinedR?

4

3 回答 3

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

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

于 2012-07-10T23:44:46.653 回答
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
于 2012-07-10T23:32:13.653 回答
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
于 2012-07-11T04:17:28.923 回答